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

Revision 3570, 10.3 KB checked in by dezhidki, 9 years ago (diff)

Talletus.

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        private 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 addBlock(IPhysicsObject obj, int bx, int by)
104        {
105            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0) throw new Exception("Can't put block to " + bx + " , " + by);
106            obj.Left = insidePos.X + (bx * blockWidth);
107            obj.Top = insidePos.Y - (by * blockHeight);
108            insideObjects[bx, by] = obj;
109        }
110
111        public void addBlock(IPhysicsObject obj, int bx, int by, Vector offset)
112        {
113            addBlock(obj, bx, by);
114            obj.Position += offset;
115        }
116
117        public void addBlockAt(IPhysicsObject obj, double x, double y)
118        {
119            obj.Left = Position.X + x;
120            obj.Top = Position.Y + y;
121            roomObjects.Add(obj);
122        }
123
124        public void addEntityAt(EntityBase ent, int bx, int by)
125        {
126            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0 || insideObjects[bx, by] != null) throw new Exception("Can't put block to " + bx + " , " + by);
127            EntityAmount++;
128            ent.Left = insidePos.X + (bx * blockWidth);
129            ent.Top = insidePos.Y + (by * blockHeight);
130            insideObjects[bx, by] = ent;
131        }
132
133        public void deleteBlock(int bx, int by)
134        {
135            insideObjects[bx, by].Destroy();
136            insideObjects[bx, by] = null;
137        }
138
139
140        // En vitsinyt käyttää enempää aikaa tämän parantamiseksi. Helppo ja toimiva
141        public void addDoors(Image doorTexture)
142        {
143            for (int i = 0; i < 4; i++)
144            {
145                Room room = Game.LevelGen.getRoomAt(PosOnGrid + RoomDirection.getOffsetFromDir(i));
146
147                if (room == null) continue;
148
149                PhysicsObject door = null;
150
151                if (i == RoomDirection.North)
152                {
153                    door = PhysicsObject.CreateStaticObject(thickness, thickness);
154                    door.Position = Position + new Vector((width + thickness) / 2, -thickness / 2);
155                    door.Image = doorTexture;
156                    door.Tag = RoomDirection.North;
157                }
158                else
159                    if (i == RoomDirection.East)
160                    {
161                        door = PhysicsObject.CreateStaticObject(thickness, thickness);
162                        door.Position = Position + new Vector(width + thickness / 2, -(height + thickness) / 2);
163                        door.Image = doorTexture;
164                        door.Angle = Angle.FromDegrees(270);
165                        door.Tag = RoomDirection.East;
166                    }
167                    else
168                        if (i == RoomDirection.South)
169                        {
170                            door = PhysicsObject.CreateStaticObject(thickness, thickness);
171                            door.Position = Position + new Vector((thickness + width) / 2, -height - thickness / 2);
172                            door.Image = Image.Flip(doorTexture);
173                            door.Tag = RoomDirection.South;
174                        }
175                        else
176                            if (i == RoomDirection.West)
177                            {
178                                door = PhysicsObject.CreateStaticObject(thickness, thickness);
179                                door.Position = Position + new Vector(thickness / 2, -height / 2 - thickness / 2);
180                                door.Image = doorTexture;
181                                door.Angle = Angle.FromDegrees(90);
182                                door.Tag = RoomDirection.West;
183                            }
184                if (door != null)
185                {
186                    roomObjects.Add(door);
187                    doors[i] = door;
188                }
189
190            }
191        }
192
193        public PhysicsObject getDoor(int dir)
194        {
195            PhysicsObject result = null;
196            for (int i = 0; i < doors.Length; i++ )
197            {
198                PhysicsObject door = doors[i];
199                if (door != null && (int)door.Tag == dir)
200                {
201                    result = door;
202                    return result;
203                }
204
205            }
206            return result;
207        }
208
209        public void createBorders(Image topBottom, Image leftRight)
210        {
211            PhysicsObject wallTop = createWall(Position, width + thickness, thickness);
212            wallTop.Color = Color.Blue;
213            wallTop.Image = topBottom;
214            PhysicsObject wallLeft = createWall(VecMath.sub(Position, new Vector(0, thickness)), thickness, height);
215            wallLeft.Color = Color.Red;
216            wallLeft.Image = leftRight;
217            PhysicsObject wallDown = createWall(VecMath.sub(Position, new Vector(0, height)), width + thickness, thickness);
218            wallDown.Color = Color.Black;
219           if(topBottom != null) wallDown.Image = Image.Flip(topBottom);
220            PhysicsObject wallRight = createWall(VecMath.add(Position, new Vector(width, -thickness)), thickness, height - thickness);
221            wallRight.Color = Color.Orange;
222           if(leftRight != null) wallRight.Image = Image.Mirror(leftRight);
223            roomDecorations.Add(wallTop);
224            roomDecorations.Add(wallLeft);
225            roomDecorations.Add(wallDown);
226            roomDecorations.Add(wallRight);
227        }
228
229        public PhysicsObject createWall(Vector pos, double width, double height)
230        {
231            wall = PhysicsObject.CreateStaticObject(width, height);
232            wall.Left = pos.X;
233            wall.Top = pos.Y;
234
235            return wall;
236        }
237
238        public PhysicsObject createBackground(Image background)
239        {
240            PhysicsObject bg = PhysicsObject.CreateStaticObject(insideWidth, insideHeight);
241            bg.Left = Position.X + thickness;
242            bg.Top = Position.Y - thickness;
243            bg.IgnoresCollisionResponse = true;
244            bg.Image = background;
245            bg.Color = Color.Green;
246            bg.IgnoresExplosions = true;
247            return bg;
248        }
249    }
250
251    public class RoomDirection
252    {
253        public const int North = 0;
254        public const int East = 1;
255        public const int South = 2;
256        public const int West = 3;
257
258        public static Vector getOffsetFromDir(int dir)
259        {
260            if (dir == North)
261                return new Vector(0, -1);
262            if (dir == East)
263                return new Vector(1, 0);
264            if (dir == South)
265                return new Vector(0, 1);
266            if (dir == West)
267                return new Vector(-1, 0);
268
269            return Vector.Zero;
270        }
271
272        public static Vector getOffsetFromWorldDir(int dir)
273        {
274            if (dir == North)
275                return new Vector(0, 1);
276            if (dir == East)
277                return new Vector(1, 0);
278            if (dir == South)
279                return new Vector(0, -1);
280            if (dir == West)
281                return new Vector(-1, 0);
282
283            return Vector.Zero;
284        }
285    }
286}
Note: See TracBrowser for help on using the repository browser.