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 ApplicationManager instance 25 @type ApplicationManager 26 */ 27 this.applicationManager = null; 28 /** A reference to the canvas element 29 @type HTMLCanvasElement 30 */ 31 this.canvas = null; 32 /** A reference to the 2D context of the canvas element 33 @type CanvasRenderingContext2D 34 */ 35 this.context2D = null; 36 /** A reference to the in-memory canvas used as a back buffer 37 @type HTMLCanvasElement 38 */ 39 this.backBuffer = null; 40 /** A reference to the backbuffer 2D context 41 @type CanvasRenderingContext2D 42 */ 43 this.backBufferContext2D = null; 44 /** True if the canvas element is supported, false otherwise 45 @type Boolean 46 */ 47 this.canvasSupported = false; 48 49 /** 50 Initialises this object 51 @return A reference to the initialised object 52 */ 53 this.startupGameObjectManager = function() 54 { 55 // set the global pointer to reference this object 56 g_GameObjectManager = this; 57 58 // watch for keyboard events 59 document.onkeydown = function(event){g_GameObjectManager.keyDown(event);} 60 document.onkeyup = function(event){g_GameObjectManager.keyUp(event);} 61 62 // get references to the canvas elements and their 2D contexts 63 this.canvas = document.getElementById('canvas'); 64 65 // if the this.canvas.getContext function does not exist it is a safe bet that 66 // the current browser does not support the canvas element. 67 // in this case we don't go any further, which will save some debuggers (like 68 // the IE8 debugger) from throwing up a lot of errors. 69 if (this.canvas.getContext) 70 { 71 this.canvasSupported = true; 72 this.context2D = this.canvas.getContext('2d'); 73 this.backBuffer = document.createElement('canvas'); 74 this.backBuffer.width = this.canvas.width; 75 this.backBuffer.height = this.canvas.height; 76 this.backBufferContext2D = this.backBuffer.getContext('2d'); 77 } 78 79 // create a new ApplicationManager 80 this.applicationManager = new ApplicationManager().startupApplicationManager(); 81 82 // use setInterval to call the draw function 83 setInterval(function(){g_GameObjectManager.draw();}, SECONDS_BETWEEN_FRAMES); 84 85 return this; 86 } 87 88 /** 89 The render loop 90 */ 91 this.draw = function () 92 { 93 // calculate the time since the last frame 94 var thisFrame = new Date().getTime(); 95 var dt = (thisFrame - this.lastFrame)/1000; 96 this.lastFrame = thisFrame; 97 98 // clear the drawing contexts 99 if (this.canvasSupported) 100 { 101 this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height); 102 this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height); 103 104 // first update all the game objects 105 for (x in this.gameObjects) 106 { 107 if (this.gameObjects[x].update) 108 { 109 this.gameObjects[x].update(dt, this.backBufferContext2D, this.xScroll, this.yScroll); 110 } 111 } 112 113 // then draw the game objects 114 for (x in this.gameObjects) 115 { 116 if (this.gameObjects[x].draw) 117 { 118 this.gameObjects[x].draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll); 119 } 120 } 121 122 // copy the back buffer to the displayed canvas 123 this.context2D.drawImage(this.backBuffer, 0, 0); 124 } 125 }; 126 127 /** 128 Adds a new GameObject to the gameObjects collection 129 @param gameObject The object to add 130 */ 131 this.addGameObject = function(gameObject) 132 { 133 this.gameObjects.push(gameObject); 134 this.gameObjects.sort(function(a,b){return a.zOrder - b.zOrder;}) 135 }; 136 137 /** 138 Removes a GameObject from the gameObjects collection 139 @param gameObject The object to remove 140 */ 141 this.removeGameObject = function(gameObject) 142 { 143 this.gameObjects.removeObject(gameObject); 144 } 145 146 this.keyDown = function(event) 147 { 148 for (x in this.gameObjects) 149 { 150 if (this.gameObjects[x].keyDown) 151 { 152 this.gameObjects[x].keyDown(event); 153 } 154 } 155 } 156 157 this.keyUp = function(event) 158 { 159 for (x in this.gameObjects) 160 { 161 if (this.gameObjects[x].keyUp) 162 { 163 this.gameObjects[x].keyUp(event); 164 } 165 } 166 } 167 }