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

Revision 3517, 4.9 KB checked in by dezhidki, 10 years ago (diff)
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
25        public Room(Game game, Vector pos, Vector size, double thickness)
26        {
27            Game = game;
28            Position = VecMath.sub(pos, new Vector(Game.Level.Width / 2, -(Game.Level.Height / 2)));
29            width = size.X;
30            height = size.Y;
31            this.thickness = thickness;
32
33            insidePos = VecMath.add(pos, new Vector(thickness, -thickness));
34            insideWidth = width - thickness;
35            insideHeight = height - thickness;
36            blockWidth = insideWidth / 10;
37            blockHeight = blockWidth;
38            bWidth = (int)(insideWidth / blockWidth);
39            bHeight = (int)(insideHeight / blockHeight);
40
41            insideObjects = new PhysicsObject[bWidth, bHeight];
42        }
43
44        public abstract void initRoom();
45
46        public void buildLevel()
47        {
48            if (roomObjects.Count == 0) throw new Exception("Cannot build empty room!");
49
50            foreach (IPhysicsObject obj in roomObjects)
51            {
52                Game.Add(obj);
53            }
54
55            foreach (IPhysicsObject obj in insideObjects)
56            {
57                if (obj != null)
58                    Game.Add(obj);
59            }
60
61
62            isBuilt = true;
63        }
64
65        public void destroyLevel()
66        {
67            if (roomObjects.Count == 0) throw new Exception("Cannot destory empty room!");
68            if (!isBuilt) throw new Exception("Cannot destroy unbuilt room!");
69
70            foreach (IPhysicsObject obj in roomObjects)
71            {
72                obj.Destroy();
73            }
74            foreach (IPhysicsObject obj in insideObjects)
75            {
76                if (obj != null)
77                    obj.Destroy();
78            }
79        }
80
81        public void addBlock(IPhysicsObject obj, int bx, int by)
82        {
83            if (bx > bWidth || bx < 0 || by > bHeight || by < 0 || insideObjects[bx, by] != null) throw new Exception("Can't put block to " + bx + " , " + by);
84            obj.Left = insidePos.X + (bx * blockWidth);
85            obj.Top = insidePos.Y + (by * blockHeight);
86            insideObjects[bx, by] = obj;
87        }
88
89        public void createBorders()
90        {
91            PhysicsObject wallTop = createWall(Position, width + thickness, thickness);
92            wallTop.Color = Color.Blue;
93            PhysicsObject wallLeft = createWall(VecMath.sub(Position, new Vector(0, thickness)), thickness, height);
94            wallLeft.Color = Color.Red;
95            PhysicsObject wallDown = createWall(VecMath.sub(Position, new Vector(0, height)), width + thickness, thickness);
96            wallDown.Color = Color.Black;
97            PhysicsObject wallRight = createWall(VecMath.add(Position, new Vector(width, -thickness)), thickness, height - thickness);
98            roomObjects.Add(wallTop);
99            roomObjects.Add(wallLeft);
100            roomObjects.Add(wallDown);
101            roomObjects.Add(wallRight);
102        }
103
104        public PhysicsObject createWall(Vector pos, double width, double height)
105        {
106            PhysicsObject wall = PhysicsObject.CreateStaticObject(width, height);
107            wall.Left = pos.X;
108            wall.Top = pos.Y;
109
110            return wall;
111        }
112
113        public PhysicsObject createBackground()
114        {
115            PhysicsObject bg = PhysicsObject.CreateStaticObject(insideWidth, insideHeight);
116            bg.Left = Position.X + thickness;
117            bg.Top = Position.Y - thickness;
118            bg.IgnoresCollisionResponse = true;
119            bg.Color = Color.Green;
120            bg.IgnoresExplosions = true;
121            return bg;
122        }
123
124    }
125
126    class RoomDirection
127    {
128        public const int North = 0;
129        public const int East = 1;
130        public const int South = 2;
131        public const int West = 3;
132
133        public static Vector getOffsetFromDir(int dir)
134        {
135            if (dir == North)
136                return new Vector(0, -1);
137            if (dir == East)
138                return new Vector(1, 0);
139            if (dir == South)
140                return new Vector(0, 1);
141            if (dir == West)
142                return new Vector(-1, 0);
143
144            return Vector.Zero;
145        }
146    }
147}
Note: See TracBrowser for help on using the repository browser.