Ignore:
Timestamp:
2012-07-03 20:04:30 (9 years ago)
Author:
dezhidki
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • 2012/27/DenisZ/TheDungeonGame/TheDungeonGame/TheDungeonGame/LevelGenerator.cs

    r3489 r3515  
    1313        private int roomAmountHor, roomAmountVert; 
    1414        private Game game; 
    15         private TestRoom[,] rooms; 
    16         private List<TestRoom> roomList = new List<TestRoom>(); 
     15        private Room[,] rooms; 
     16        private List<Room> roomList = new List<Room>(); 
    1717 
    1818        public LevelGenerator(Game game, Vector size, Vector roomamount) 
     
    2424            roomAmountVert = (int)roomamount.Y; 
    2525 
    26             rooms = new TestRoom[roomAmountHor, roomAmountVert]; 
     26            rooms = new Room[roomAmountHor, roomAmountVert]; 
    2727        } 
    2828 
    29         public void buildLevel() 
     29        public Vector CenterRoom 
    3030        { 
    31             foreach (TestRoom room in roomList) 
     31            get 
    3232            { 
    33                     room.buildLevel(); 
     33                return new Vector(roomAmountHor / 2, roomAmountVert / 2); 
     34            } 
     35        } 
     36 
     37        public void buildDungeon() 
     38        { 
     39            foreach (Room room in roomList) 
     40            { 
     41                room.buildLevel(); 
     42            } 
     43        } 
     44 
     45        public void destroyDungeon() 
     46        { 
     47            foreach (Room room in roomList) 
     48            { 
     49                room.destroyLevel(); 
    3450            } 
    3551        } 
     
    3854        { 
    3955            int roomAmount = RandomGen.NextInt(minRooms, maxRooms); 
    40             TestRoom lastRoom = null; 
     56            Room lastRoom = null; 
    4157 
    4258            for (int room = 0; room < roomAmount; room++) 
     
    5369                bool[] sideChecked = new bool[4]; 
    5470 
    55                 //  while (checkedSides < 4) 
    56                 //   { 
    57                 int dir = 2; 
    58                 /* if (sideChecked[dir]) 
    59                  { 
    60                      checkedSides++; 
    61                      continue; 
    62                  } */ 
    63                 //  if (lastRoom == null) return; 
    64                 checkedSides++; 
    65                 lastRoom = tryCreateRoom(dir, VecMath.add(lastRoom.RoomsPosOnGrid, RoomDirection.getOffsetFromDir(dir)), lastRoom); 
    66                 // } 
     71                while (checkedSides < 4) 
     72                { 
     73                    int dir = RandomGen.NextInt(4); 
     74                    if (sideChecked[dir]) 
     75                    { 
     76                        checkedSides++; 
     77                        continue; 
     78                    } 
     79                    else 
     80                    { 
     81                        checkedSides++; 
     82                        sideChecked[dir] = true; 
     83                    } 
     84 
     85                    if (tryCreateRoom(dir, VecMath.add(lastRoom.PosOnGrid, RoomDirection.getOffsetFromDir(dir)), lastRoom)) 
     86                    { 
     87                        lastRoom = currentRoom; 
     88                        break; 
     89                    } 
     90 
     91                } 
    6792 
    6893            } 
    6994        } 
    7095 
    71         private TestRoom tryCreateRoom(int dir, Vector pos, Room lastRoom) 
     96 
     97 
     98        private Room currentRoom; 
     99        private bool tryCreateRoom(int dir, Vector pos, Room lastRoom) 
    72100        { 
    73             if (getRoomFromDirection(lastRoom, dir) != null) return null; 
    74  
    75             TestRoom currentRoom = new TestRoom(game, VecMath.mul(pos, new Vector(TheDungeonGame.ROOMWIDTH, -TheDungeonGame.ROOMHEIGHT)), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS); 
    76             placeRoomAt(currentRoom, (int)pos.X, (int)pos.Y); 
    77             return currentRoom; 
     101            if (getRoomFromDirection(lastRoom, dir) != null) return false; 
     102            currentRoom = new TestRoom(game, VecMath.mul(pos, new Vector(TheDungeonGame.ROOMWIDTH, -TheDungeonGame.ROOMHEIGHT)), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS); 
     103            return placeRoomAt(currentRoom, (int)pos.X, (int)pos.Y); 
    78104        } 
    79105 
    80         public void placeRoomAt(TestRoom room, int x, int y) 
     106        public bool placeRoomAt(Room room, int x, int y) 
    81107        { 
    82             if (x > roomAmountHor || x < 0 || y > roomAmountVert || y < 0 || getRoomAt(x, y) != null) throw new Exception("Cant place Room there!"); 
    83             room.RoomsPosOnGrid = new Vector(x, y); 
     108            if (!isValidPos(x, y) || getRoomAt(x, y) != null) return false; 
     109            room.PosOnGrid = new Vector(x, y); 
    84110            rooms[x, y] = room; 
    85111            roomList.Add(room); 
     112            return true; 
    86113        } 
    87114 
    88115        public Room getRoomAt(int x, int y) 
    89116        { 
    90             if (x > roomAmountHor || x < 0 || y > roomAmountVert || y < 0) return null; 
     117            if (!isValidPos(x, y)) return null; 
    91118            return rooms[x, y]; 
    92119        } 
     
    94121        public Room getRoomFromDirection(Room source, int dir) 
    95122        { 
    96             int roomX = (int)source.RoomsPosOnGrid.X; 
    97             int roomY = (int)source.RoomsPosOnGrid.Y; 
     123            int roomX = (int)source.PosOnGrid.X; 
     124            int roomY = (int)source.PosOnGrid.Y; 
    98125 
    99             if (dir == RoomDirection.North) 
    100                 return getRoomAt(roomX, roomY - 1); 
    101             if (dir == RoomDirection.East) 
    102                 return getRoomAt(roomX + 1, roomY); 
    103             if (dir == RoomDirection.North) 
    104                 return getRoomAt(roomX, roomY + 1); 
    105             if (dir == RoomDirection.West) 
    106                 return getRoomAt(roomX - 1, roomY); 
    107  
    108             return null; 
     126            Vector roomPos = VecMath.add(source.PosOnGrid, RoomDirection.getOffsetFromDir(dir)); 
     127            return getRoomAt((int)roomPos.X, (int)roomPos.Y); 
    109128        } 
    110129 
     
    115134        } 
    116135 
    117         public Vector CenterRoom 
     136        private bool isValidPos(int x, int y) 
    118137        { 
    119             get 
    120             { 
    121                 return new Vector(roomAmountHor / 2, roomAmountVert / 2); 
    122             } 
     138            return !(x >= roomAmountHor || x < 0 || y >= roomAmountVert || y < 0); 
    123139        } 
     140 
     141 
    124142    } 
    125143} 
Note: See TracChangeset for help on using the changeset viewer.