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

Top