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

Revision 3562, 8.6 KB checked in by dezhidki, 10 years ago (diff)

Made player really go through the door, nor just spawn in the middle of the room when going through door

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> roomObjects = new List<IPhysicsObject>();
17        private bool isBuilt = false;
18        protected IPhysicsObject[,] insideObjects;
19        protected PhysicsObject[] doors = new PhysicsObject[4];
20        protected double blockWidth, blockHeight;
21        protected double insideWidth, insideHeight;
22        protected Vector insidePos;
23        protected int bWidth, bHeight;
24        public TheDungeonGame Game { get; set; }
25        public Vector PosOnGrid { get; set; }
26        public PhysicsObject wall;
27        public int EntityAmount { get; set; }
28
29        public Room(TheDungeonGame game, Vector pos, Vector size, double thickness)
30        {
31            Game = game;
32            Position = VecMath.sub(pos, new Vector(Game.Level.Width / 2, -(Game.Level.Height / 2)));
33            width = size.X;
34            height = size.Y;
35            this.thickness = thickness;
36
37            insidePos = VecMath.add(Position, new Vector(thickness, -thickness));
38            insideWidth = width - thickness;
39            insideHeight = height - thickness;
40            blockWidth = insideWidth / 10;
41            blockHeight = blockWidth;
42            bWidth = (int)(insideWidth / blockWidth);
43            bHeight = (int)(insideHeight / blockHeight);
44
45            insideObjects = new PhysicsObject[bWidth, bHeight];
46        }
47
48        public abstract void initRoom();
49
50        public void buildLevel()
51        {
52            if (roomObjects.Count == 0) throw new Exception("Cannot build empty room!");
53
54            foreach (IPhysicsObject obj in roomObjects)
55            {
56                Game.Add(obj);
57            }
58
59            foreach (IPhysicsObject obj in insideObjects)
60            {
61                if (obj != null)
62                    Game.Add(obj);
63            }
64
65
66            isBuilt = true;
67        }
68
69        public void destroyLevel()
70        {
71            if (roomObjects.Count == 0) throw new Exception("Cannot destory empty room!");
72            if (!isBuilt) throw new Exception("Cannot destroy unbuilt room!");
73
74            foreach (IPhysicsObject obj in roomObjects)
75            {
76                obj.Destroy();
77            }
78            foreach (IPhysicsObject obj in insideObjects)
79            {
80                if (obj != null)
81                    obj.Destroy();
82            }
83        }
84
85        public void addBlock(IPhysicsObject obj, int bx, int by)
86        {
87            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0 || insideObjects[bx, by] != null) throw new Exception("Can't put block to " + bx + " , " + by);
88            obj.Left = insidePos.X + (bx * blockWidth);
89            obj.Top = insidePos.Y - (by * blockHeight);
90            insideObjects[bx, by] = obj;
91        }
92
93        public void addBlockAt(IPhysicsObject obj, double x, double y)
94        {
95            obj.Left = Position.X + x;
96            obj.Top = Position.Y + y;
97            roomObjects.Add(obj);
98        }
99
100        public void addEntityAt(EntityBase ent, int bx, int by)
101        {
102            if (bx >= bWidth || bx < 0 || by >= bHeight || by < 0 || insideObjects[bx, by] != null) throw new Exception("Can't put block to " + bx + " , " + by);
103            EntityAmount++;
104            ent.Left = insidePos.X + (bx * blockWidth);
105            ent.Top = insidePos.Y * (by * blockHeight);
106            insideObjects[bx, by] = ent;
107        }
108
109
110        // En vitsinyt käyttää enempää aikaa tämän parantamiseksi. Helppo ja toimiva
111        public void addDoors()
112        {
113            for (int i = 0; i < 4; i++)
114            {
115                Room room = Game.LevelGen.getRoomAt(PosOnGrid + RoomDirection.getOffsetFromDir(i));
116
117                if (room == null) continue;
118
119                PhysicsObject door = null;
120
121                if (i == RoomDirection.North)
122                {
123                    door = PhysicsObject.CreateStaticObject(thickness, thickness);
124                    door.Position = Position + new Vector((width + thickness) / 2, -thickness / 2);
125                    door.Tag = RoomDirection.North;
126                }
127                else
128                    if (i == RoomDirection.East)
129                    {
130                        door = PhysicsObject.CreateStaticObject(thickness, thickness);
131                        door.Position = Position + new Vector(width + thickness / 2, -(height + thickness) / 2);
132                        door.Tag = RoomDirection.East;
133                    }
134                    else
135                        if (i == RoomDirection.South)
136                        {
137                            door = PhysicsObject.CreateStaticObject(thickness, thickness);
138                            door.Position = Position + new Vector((thickness + width) / 2, -height - thickness / 2);
139                            door.Tag = RoomDirection.South;
140                        }
141                        else
142                            if (i == RoomDirection.West)
143                            {
144                                door = PhysicsObject.CreateStaticObject(thickness, thickness);
145                                door.Position = Position + new Vector(thickness / 2, -height / 2 - thickness / 2);
146                                door.Tag = RoomDirection.West;
147                            }
148                if (door != null)
149                {
150                    roomObjects.Add(door);
151                    doors[i] = door;
152                }
153
154            }
155        }
156
157        public PhysicsObject getDoor(int dir)
158        {
159            PhysicsObject result = null;
160            for (int i = 0; i < doors.Length; i++ )
161            {
162                PhysicsObject door = doors[i];
163                if (door != null && (int)door.Tag == dir)
164                {
165                    result = door;
166                    return result;
167                }
168
169            }
170            return result;
171        }
172
173        public void createBorders()
174        {
175            PhysicsObject wallTop = createWall(Position, width + thickness, thickness);
176            wallTop.Color = Color.Blue;
177            PhysicsObject wallLeft = createWall(VecMath.sub(Position, new Vector(0, thickness)), thickness, height);
178            wallLeft.Color = Color.Red;
179            PhysicsObject wallDown = createWall(VecMath.sub(Position, new Vector(0, height)), width + thickness, thickness);
180            wallDown.Color = Color.Black;
181            PhysicsObject wallRight = createWall(VecMath.add(Position, new Vector(width, -thickness)), thickness, height - thickness);
182            wallRight.Color = Color.Orange;
183            roomObjects.Add(wallTop);
184            roomObjects.Add(wallLeft);
185            roomObjects.Add(wallDown);
186            roomObjects.Add(wallRight);
187        }
188
189        public PhysicsObject createWall(Vector pos, double width, double height)
190        {
191            wall = PhysicsObject.CreateStaticObject(width, height);
192            wall.Left = pos.X;
193            wall.Top = pos.Y;
194
195            return wall;
196        }
197
198        public PhysicsObject createBackground()
199        {
200            PhysicsObject bg = PhysicsObject.CreateStaticObject(insideWidth, insideHeight);
201            bg.Left = Position.X + thickness;
202            bg.Top = Position.Y - thickness;
203            bg.IgnoresCollisionResponse = true;
204            bg.Color = Color.Green;
205            bg.IgnoresExplosions = true;
206            return bg;
207        }
208
209    }
210
211    public class RoomDirection
212    {
213        public const int North = 0;
214        public const int East = 1;
215        public const int South = 2;
216        public const int West = 3;
217
218        public static Vector getOffsetFromDir(int dir)
219        {
220            if (dir == North)
221                return new Vector(0, -1);
222            if (dir == East)
223                return new Vector(1, 0);
224            if (dir == South)
225                return new Vector(0, 1);
226            if (dir == West)
227                return new Vector(-1, 0);
228
229            return Vector.Zero;
230        }
231
232        public static Vector getOffsetFromWorldDir(int dir)
233        {
234            if (dir == North)
235                return new Vector(0, 1);
236            if (dir == East)
237                return new Vector(1, 0);
238            if (dir == South)
239                return new Vector(0, -1);
240            if (dir == West)
241                return new Vector(-1, 0);
242
243            return Vector.Zero;
244        }
245    }
246}
Note: See TracBrowser for help on using the repository browser.