source: 2012/27/DenisZ/TheDungeonGame/TheDungeonGame/TheDungeonGame/LevelGenerator.cs @ 3538

Revision 3538, 4.9 KB checked in by dezhidki, 8 years ago (diff)

Updated camera motion

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using MathHelper;
7
8namespace Rooms
9{
10  public class LevelGenerator
11    {
12        private double width, height;
13        private int roomAmountHor, roomAmountVert;
14        private Game game;
15        private Room[,] rooms;
16        private List<Room> roomList = new List<Room>();
17
18        public LevelGenerator(TheDungeonGame game, Vector size, Vector roomamount)
19        {
20            this.game = game;
21            width = size.X;
22            height = size.Y;
23            roomAmountHor = (int)roomamount.X;
24            roomAmountVert = (int)roomamount.Y;
25
26            rooms = new Room[roomAmountHor, roomAmountVert];
27        }
28
29        public Vector getGridPos(Vector pos)
30        {
31            double gridPosX = pos.X - width / 2;
32            double gridPosY = pos.Y + height / 2;
33
34            int x = (int)(gridPosX / TheDungeonGame.ROOMWIDTH);
35            int y = (int)(gridPosY / TheDungeonGame.ROOMHEIGHT);
36
37            return new Vector(x, y);
38        }
39
40        public Vector CenterRoom
41        {
42            get
43            {
44                return new Vector(roomAmountHor / 2, roomAmountVert / 2);
45            }
46        }
47
48        public void buildDungeon()
49        {
50            foreach (Room room in roomList)
51            {
52                room.buildLevel();
53            }
54        }
55
56        public void destroyDungeon()
57        {
58            foreach (Room room in roomList)
59            {
60                room.destroyLevel();
61            }
62        }
63
64        public void generateRandomLevel(int minRooms, int maxRooms)
65        {
66            int roomAmount = RandomGen.NextInt(minRooms, maxRooms);
67            Room lastRoom = null;
68
69            for (int room = 0; room < roomAmount; room++)
70            {
71                if (room == 0)
72                {
73                    lastRoom = new TestRoom(game, VecMath.mul(CenterRoom, new Vector(TheDungeonGame.ROOMWIDTH + TheDungeonGame.ROOMTHICKNESS, -TheDungeonGame.ROOMHEIGHT - TheDungeonGame.ROOMTHICKNESS)), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS);
74                    placeRoomAt(lastRoom, (int)CenterRoom.X, (int)CenterRoom.Y);
75                    continue;
76                }
77
78                Room randomRoom = getRandomRoom();
79                int checkedSides = 0;
80                bool[] sideChecked = new bool[4];
81
82                while (checkedSides < 4)
83                {
84                    int dir = RandomGen.NextInt(4);
85                    if (sideChecked[dir])
86                    {
87                        checkedSides++;
88                        continue;
89                    }
90                    else
91                    {
92                        checkedSides++;
93                        sideChecked[dir] = true;
94                    }
95
96                    if (tryCreateRoom(dir, VecMath.add(lastRoom.PosOnGrid, RoomDirection.getOffsetFromDir(dir)), lastRoom))
97                    {
98                        lastRoom = currentRoom;
99                        break;
100                    }
101
102                }
103
104            }
105        }
106
107
108
109        private Room currentRoom;
110        private bool tryCreateRoom(int dir, Vector pos, Room lastRoom)
111        {
112            if (getRoomFromDirection(lastRoom, dir) != null) return false;
113            currentRoom = new TestRoom(game, VecMath.mul(pos, new Vector(TheDungeonGame.ROOMWIDTH + TheDungeonGame.ROOMTHICKNESS, -TheDungeonGame.ROOMHEIGHT - TheDungeonGame.ROOMTHICKNESS)), TheDungeonGame.roomSize, TheDungeonGame.ROOMTHICKNESS);
114            return placeRoomAt(currentRoom, (int)pos.X, (int)pos.Y);
115        }
116
117        public bool placeRoomAt(Room room, int x, int y)
118        {
119            if (!isValidPos(x, y) || getRoomAt(x, y) != null) return false;
120            room.PosOnGrid = new Vector(x, y);
121            rooms[x, y] = room;
122            roomList.Add(room);
123            return true;
124        }
125
126        public Room getRoomAt(int x, int y)
127        {
128            if (!isValidPos(x, y)) return null;
129            return rooms[x, y];
130        }
131
132        public Room getRoomAt(Vector pos)
133        {
134            return getRoomAt((int)pos.X, (int)pos.Y);
135        }
136
137        public Room getRoomFromDirection(Room source, int dir)
138        {
139            int roomX = (int)source.PosOnGrid.X;
140            int roomY = (int)source.PosOnGrid.Y;
141
142            Vector roomPos = VecMath.add(source.PosOnGrid, RoomDirection.getOffsetFromDir(dir));
143            return getRoomAt((int)roomPos.X, (int)roomPos.Y);
144        }
145
146        public Room getRandomRoom()
147        {
148            if (roomList.Count == 0) throw new InvalidOperationException("The List is empty!");
149            return roomList[RandomGen.NextInt(roomList.Count)];
150        }
151
152        private bool isValidPos(int x, int y)
153        {
154            return !(x >= roomAmountHor || x < 0 || y >= roomAmountVert || y < 0);
155        }
156
157
158    }
159}
Note: See TracBrowser for help on using the repository browser.