1     /**
2         A manager for all the objects in the game
3         @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
4         @class
5     */
6     function GameObjectManager()
7 {
8 /** An array of game objects 9 @type Arary 10 */ 11 this.gameObjects = new Array();
12 /** The time that the last frame was rendered 13 @type Date 14 */ 15 this.lastFrame = new Date().getTime();
16 /** The global scrolling value of the x axis 17 @type Number 18 */ 19 this.xScroll = 0;
20 /** The global scrolling value of the y axis 21 @type Number 22 */ 23 this.yScroll = 0;
24 /** A reference to the canvas element 25 @type HTMLCanvasElement 26 */ 27 this.canvas = null;
28 /** A reference to the 2D context of the canvas element 29 @type CanvasRenderingContext2D 30 */ 31 this.context2D = null;
32 /** A reference to the in-memory canvas used as a back buffer 33 @type HTMLCanvasElement 34 */ 35 this.backBuffer = null;
36 /** A reference to the backbuffer 2D context 37 @type CanvasRenderingContext2D 38 */ 39 this.backBufferContext2D = null;
40 /** True if the canvas element is supported, false otherwise 41 @type Boolean 42 */ 43 this.canvasSupported = false;
44 /** True if the resources supplied to the ResourceManager are all loaded, false otherwise 45 @type Boolean 46 */ 47 this.resourcesLoaded = false;
48 /** The current colour of the loading screen 49 @type Number 50 */ 51 this.loadingScreenCol = 0;
52 /** The direction of the changes to the loading screen colour. 53 1 = colour moving towards white 54 -1 = colour moving topwards balck 55 @type Number 56 */ 57 this.loadingScreenColDirection = 1;
58 /** How quickly to change the loading screen colour per second 59 @type Number 60 */ 61 this.loadingScreenColSpeed = 255;
62 63 /** 64 Initialises this object 65 @return A reference to the initialised object 66 */ 67 this.startupGameObjectManager = function()
68 {
69 // set the global pointer to reference this object 70 g_GameObjectManager = this;
71 72 // watch for keyboard events 73 document.onkeydown = function(event){g_GameObjectManager.keyDown(event);}
74 document.onkeyup = function(event){g_GameObjectManager.keyUp(event);}
75 76 // get references to the canvas elements and their 2D contexts 77 this.canvas = document.getElementById('canvas');
78 79 // if the this.canvas.getContext function does not exist it is a safe bet that 80 // the current browser does not support the canvas element. 81 // in this case we don't go any further, which will save some debuggers (like 82 // the IE8 debugger) from throwing up a lot of errors. 83 if (this.canvas.getContext)
84 {
85 this.canvasSupported = true;
86 this.context2D = this.canvas.getContext('2d');
87 this.backBuffer = document.createElement('canvas');
88 this.backBuffer.width = this.canvas.width;
89 this.backBuffer.height = this.canvas.height;
90 this.backBufferContext2D = this.backBuffer.getContext('2d');
91 }
92 93 // create a new ResourceManager 94 new ResourceManager().startupResourceManager(
95 [{name: 'runLeft', src: 'run_left.png'},
96 {name: 'runRight', src: 'run_right.png'},
97 {name: 'idleLeft', src: 'idle_left.png'},
98 {name: 'idleRight', src: 'idle_right.png'},
99 {name: 'background0', src: 'jsplatformer4_b0.png'},
100 {name: 'background1', src: 'jsplatformer4_b1.png'},
101 {name: 'background2', src: 'jsplatformer4_b2.png'},
102 {name: 'block', src: 'BlockA0.png'},
103 {name: 'gem', src: 'Gem.png'}]);
104 105 // use setInterval to call the draw function 106 setInterval(function(){g_GameObjectManager.draw();}, SECONDS_BETWEEN_FRAMES);
107 108 return this;
109 }
110 111 /** 112 The render loop 113 */ 114 this.draw = function ()
115 {
116 // calculate the time since the last frame 117 var thisFrame = new Date().getTime();
118 var dt = (thisFrame - this.lastFrame)/1000;
119 this.lastFrame = thisFrame;
120 121 if (!this.resourcesLoaded)
122 {
123 var numLoaded = 0;
124 for (i = 0; i < g_ResourceManager.imageProperties.length; ++i)
125 {
126 if (g_ResourceManager[g_ResourceManager.imageProperties[i]].complete)
127 ++numLoaded;
128 }
129 130 if ( numLoaded == g_ResourceManager.imageProperties.length )
131 {
132 // create a new ApplicationManager 133 new ApplicationManager().startupApplicationManager(this.canvas.width, this.canvas.height);
134 this.resourcesLoaded = true;
135 }
136 else 137 {
138 this.loadingScreenCol += this.loadingScreenColDirection * this.loadingScreenColSpeed * dt;
139 if (this.loadingScreenCol > 255)
140 {
141 this.loadingScreenCol = 255;
142 this.loadingScreenColDirection = -1;
143 }
144 else if (this.loadingScreenCol < 0)
145 {
146 this.loadingScreenCol = 0;
147 this.loadingScreenColDirection = 1;
148 }
149 this.context2D.fillStyle = "rgb(" + parseInt(this.loadingScreenCol) + "," + parseInt(this.loadingScreenCol) + "," + parseInt(this.loadingScreenCol) + ")";
150 this.context2D.fillRect (0, 0, this.canvas.width, this.canvas.height);
151 }
152 }
153 154 // clear the drawing contexts 155 if (this.canvasSupported && this.resourcesLoaded)
156 {
157 this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height);
158 this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);
159 160 // first update all the game objects 161 for (x in this.gameObjects)
162 {
163 if (this.gameObjects[x].update)
164 {
165 this.gameObjects[x].update(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
166 }
167 }
168 169 // then draw the game objects 170 for (x in this.gameObjects)
171 {
172 if (this.gameObjects[x].draw)
173 {
174 this.gameObjects[x].draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
175 }
176 }
177 178 // copy the back buffer to the displayed canvas 179 this.context2D.drawImage(this.backBuffer, 0, 0);
180 }
181 };
182 183 /** 184 Adds a new GameObject to the gameObjects collection 185 @param gameObject The object to add 186 */ 187 this.addGameObject = function(gameObject)
188 {
189 this.gameObjects.push(gameObject);
190 this.gameObjects.sort(function(a,b){return a.zOrder - b.zOrder;})
191 };
192 193 /** 194 Removes a GameObject from the gameObjects collection 195 @param gameObject The object to remove 196 */ 197 this.removeGameObject = function(gameObject)
198 {
199 this.gameObjects.removeObject(gameObject);
200 }
201 202 this.keyDown = function(event)
203 {
204 for (x in this.gameObjects)
205 {
206 if (this.gameObjects[x].keyDown)
207 {
208 this.gameObjects[x].keyDown(event);
209 }
210 }
211 }
212 213 this.keyUp = function(event)
214 {
215 for (x in this.gameObjects)
216 {
217 if (this.gameObjects[x].keyUp)
218 {
219 this.gameObjects[x].keyUp(event);
220 }
221 }
222 }
223 }
Top