source: 2012/27/DenisZ/TheDungeonGame/TheDungeonGame/TheDungeonGame/Room.cs @ 3572

Revision 3572, 11.5 KB checked in by dezhidki, 9 years ago (diff)

Levels are now dissapearing, if not on the screen
Possible to spawn random levels

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using MathHelper;
7using Entity;
8
9namespace Rooms
10{
11    public abstract class Room
12    {
13
14        public Vector Position;
15        public double width, height, thickness;
16        protected List<IPhysicsObject> roomDecorations = new List<IPhysicsObject>();
17        protected List<IPhysicsObject> roomObjects = new List<IPhysicsObject>();
18        public bool isBuilt = false;
19        protected IPhysicsObject[,] insideObjects;
20        protected PhysicsObject[] doors = new PhysicsObject[4];
21        protected double blockWidth, blockHeight;
22        protected double insideWidth, insideHeight;
23        protected Vector insidePos;
24        protected int bWidth, bHeight;
25        public TheDungeonGame Game { get; set; }
26        public Vector PosOnGrid { get; set; }
27        public PhysicsObject wall;
28        public int EntityAmount { get; set; }
29
30        public Room(TheDungeonGame game, Vector pos, Vector size, double thickness)
31        {
32            Game = game;
33            Position = VecMath.sub(pos, new Vector(Game.Level.Width / 2, -(Game.Level.Height / 2)));
34            width = size.X;
35            height = size.Y;
36            this.thickness = thickness;
37
38            insidePos = VecMath.add(Position, new Vector(thickness, -thickness));
39            insideWidth = width - thickness;
40            insideHeight = height - thickness;
41            blockWidth = insideWidth / 10;
42            blockHeight = blockWidth;
43            bWidth = (int)(insideWidth / blockWidth);
44            bHeight = (int)(insideHeight / blockHeight);
45
46            insideObjects = new PhysicsObject[bWidth, bHeight];
47        }
48
49        public abstract void initRoom();
50
51        protected void createLevelDecorations()
52        {
53            int level = Game.LevelGen.level;
54            createBorders(Game.getTopBottomWall(level), Game.getLeftRightWall(level));
55            addDoors(Game.objectTextures[0]);
56            roomDecorations.Add(createBackground(Game.getLevelBackground(level)));
57        }
58
59        public void buildLevel()
60        {
61            if (roomDecorations.Count == 0 && roomObjects.Count == 0) throw new Exception("Cannot build empty room!");
62
63            foreach (IPhysicsObject obj in roomDecorations)
64            {
65                Game.Add(obj);
66            }
67
68            foreach (IPhysicsObject obj in roomObjects)
69            {
70                Game.Add(obj, 1);
71            }
72
73            foreach (IPhysicsObject obj in insideObjects)
74            {
75                if (obj != null)
76                    Game.Add(obj, 1);
77            }
78
79
80            isBuilt = true;
81        }
82
83        public void destroyLevel()
84        {
85            if (roomDecorations.Count == 0) throw new Exception("Cannot destory empty room!");
86            if (!isBuilt) return;
87
88            foreach (IPhysicsObject obj in roomDecorations)
89            {
90                obj.Destroy();
91            }
92            foreach (IPhysicsObject obj in roomObjects)
93            {
94                obj.Destroy();
95            }
96            foreach (IPhysicsObject obj in insideObjects)
97            {
98                if (obj != null)
99                    obj.Destroy();
100            }
101        }
102
103        public void hideLevel()
104        {
105            if (roomDecorations.Count == 0) throw new Exception("Cannot hide empty room!");
106            if (!isBuilt) return;
107
108            foreach (IPhysicsObject obj in roomDecorations)
109            {
110                obj.IsVisible = false;
111            }
112            foreach (IPhysicsObject obj in roomObjects)
113            {
114                obj.IsVisible = false;
115            }
116            foreach (IPhysicsObject obj in insideObjects)
117            {
118                if (obj != null)
119                    obj.IsVisible = false;
120            }
121        }
122
123        public void restoreLevel()
124        {
125            if (roomDecorations.Count == 0) throw new Exception("Cannot hide empty room!");
126            if (!isBuilt) return;
127
128            foreach (IPhysicsObject obj in roomDecorations)
129            {
130                obj.IsVisible = true;
131            }
132            foreach (IPhysicsObject obj in roomObjects)
133            {
134                obj.IsVisible = true;
135            }
136            foreach (IPhysicsObject obj in insideObjects)
137            {
138                if (obj != null)
139                    obj.IsVisible = true;
140            }
141        }
142
143        public void addBlock(IPhysicsObject obj, int bx, int by)
144        {
145            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0) throw new Exception("Can't put block to " + bx + " , " + by);
146            obj.Left = insidePos.X + (bx * blockWidth);
147            obj.Top = insidePos.Y - (by * blockHeight);
148            insideObjects[bx, by] = obj;
149        }
150
151        public void addBlock(IPhysicsObject obj, int bx, int by, Vector offset)
152        {
153            addBlock(obj, bx, by);
154            obj.Position += offset;
155        }
156
157        public void addBlockAt(IPhysicsObject obj, double x, double y)
158        {
159            obj.Left = Position.X + x;
160            obj.Top = Position.Y + y;
161            roomObjects.Add(obj);
162        }
163
164        public void addEntityAt(EntityBase ent, int bx, int by)
165        {
166            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0 || insideObjects[bx, by] != null) throw new Exception("Can't put block to " + bx + " , " + by);
167            EntityAmount++;
168            ent.Left = insidePos.X + (bx * blockWidth);
169            ent.Top = insidePos.Y + (by * blockHeight);
170            insideObjects[bx, by] = ent;
171        }
172
173        public void deleteBlock(int bx, int by)
174        {
175            insideObjects[bx, by].Destroy();
176            insideObjects[bx, by] = null;
177        }
178
179
180        // En vitsinyt käyttää enempää aikaa tämän parantamiseksi. Helppo ja toimiva
181        public void addDoors(Image doorTexture)
182        {
183            for (int i = 0; i < 4; i++)
184            {
185                Room room = Game.LevelGen.getRoomAt(PosOnGrid + RoomDirection.getOffsetFromDir(i));
186
187                if (room == null) continue;
188
189                PhysicsObject door = null;
190
191                if (i == RoomDirection.North)
192                {
193                    door = PhysicsObject.CreateStaticObject(thickness, thickness);
194                    door.Position = Position + new Vector((width + thickness) / 2, -thickness / 2);
195                    door.Image = doorTexture;
196                    door.Tag = RoomDirection.North;
197                }
198                else
199                    if (i == RoomDirection.East)
200                    {
201                        door = PhysicsObject.CreateStaticObject(thickness, thickness);
202                        door.Position = Position + new Vector(width + thickness / 2, -(height + thickness) / 2);
203                        door.Image = doorTexture;
204                        door.Angle = Angle.FromDegrees(270);
205                        door.Tag = RoomDirection.East;
206                    }
207                    else
208                        if (i == RoomDirection.South)
209                        {
210                            door = PhysicsObject.CreateStaticObject(thickness, thickness);
211                            door.Position = Position + new Vector((thickness + width) / 2, -height - thickness / 2);
212                            door.Image = Image.Flip(doorTexture);
213                            door.Tag = RoomDirection.South;
214                        }
215                        else
216                            if (i == RoomDirection.West)
217                            {
218                                door = PhysicsObject.CreateStaticObject(thickness, thickness);
219                                door.Position = Position + new Vector(thickness / 2, -height / 2 - thickness / 2);
220                                door.Image = doorTexture;
221                                door.Angle = Angle.FromDegrees(90);
222                                door.Tag = RoomDirection.West;
223                            }
224                if (door != null)
225                {
226                    roomObjects.Add(door);
227                    doors[i] = door;
228                }
229
230            }
231        }
232
233        public PhysicsObject getDoor(int dir)
234        {
235            PhysicsObject result = null;
236            for (int i = 0; i < doors.Length; i++ )
237            {
238                PhysicsObject door = doors[i];
239                if (door != null && (int)door.Tag == dir)
240                {
241                    result = door;
242                    return result;
243                }
244
245            }
246            return result;
247        }
248
249        public void createBorders(Image topBottom, Image leftRight)
250        {
251            PhysicsObject wallTop = createWall(Position, width + thickness, thickness);
252            wallTop.Color = Color.Blue;
253            wallTop.Image = topBottom;
254            PhysicsObject wallLeft = createWall(VecMath.sub(Position, new Vector(0, thickness)), thickness, height);
255            wallLeft.Color = Color.Red;
256            wallLeft.Image = leftRight;
257            PhysicsObject wallDown = createWall(VecMath.sub(Position, new Vector(0, height)), width + thickness, thickness);
258            wallDown.Color = Color.Black;
259           if(topBottom != null) wallDown.Image = Image.Flip(topBottom);
260            PhysicsObject wallRight = createWall(VecMath.add(Position, new Vector(width, -thickness)), thickness, height - thickness);
261            wallRight.Color = Color.Orange;
262           if(leftRight != null) wallRight.Image = Image.Mirror(leftRight);
263            roomDecorations.Add(wallTop);
264            roomDecorations.Add(wallLeft);
265            roomDecorations.Add(wallDown);
266            roomDecorations.Add(wallRight);
267        }
268
269        public PhysicsObject createWall(Vector pos, double width, double height)
270        {
271            wall = PhysicsObject.CreateStaticObject(width, height);
272            wall.Left = pos.X;
273            wall.Top = pos.Y;
274
275            return wall;
276        }
277
278        public PhysicsObject createBackground(Image background)
279        {
280            PhysicsObject bg = PhysicsObject.CreateStaticObject(insideWidth, insideHeight);
281            bg.Left = Position.X + thickness;
282            bg.Top = Position.Y - thickness;
283            bg.IgnoresCollisionResponse = true;
284            bg.Image = background;
285            bg.Color = Color.Green;
286            bg.IgnoresExplosions = true;
287            return bg;
288        }
289    }
290
291    public class RoomDirection
292    {
293        public const int North = 0;
294        public const int East = 1;
295        public const int South = 2;
296        public const int West = 3;
297
298        public static Vector getOffsetFromDir(int dir)
299        {
300            if (dir == North)
301                return new Vector(0, -1);
302            if (dir == East)
303                return new Vector(1, 0);
304            if (dir == South)
305                return new Vector(0, 1);
306            if (dir == West)
307                return new Vector(-1, 0);
308
309            return Vector.Zero;
310        }
311
312        public static Vector getOffsetFromWorldDir(int dir)
313        {
314            if (dir == North)
315                return new Vector(0, 1);
316            if (dir == East)
317                return new Vector(1, 0);
318            if (dir == South)
319                return new Vector(0, -1);
320            if (dir == West)
321                return new Vector(-1, 0);
322
323            return Vector.Zero;
324        }
325    }
326}
Note: See TracBrowser for help on using the repository browser.