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

Revision 3525, 7.4 KB checked in by dezhidki, 8 years ago (diff)

Added basic camera logic.
Added basic templates for Doors

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