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

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