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

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