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 45 /** 46 Initialises this object 47 @return A reference to the initialised object 48 */ 49 this.startupGameObjectManager = function() 50 { 51 // set the global pointer to reference this object 52 g_GameObjectManager = this; 53 54 // get references to the canvas elements and their 2D contexts 55 this.canvas = document.getElementById('canvas'); 56 this.context2D = this.canvas.getContext('2d'); 57 this.backBuffer = document.createElement('canvas'); 58 this.backBuffer.width = this.canvas.width; 59 this.backBuffer.height = this.canvas.height; 60 this.backBufferContext2D = this.backBuffer.getContext('2d'); 61 62 // create a new ApplicationManager 63 this.applicationManager = new ApplicationManager().startupApplicationManager(); 64 65 // use setInterval to call the draw function 66 setInterval(function(){g_GameObjectManager.draw();}, SECONDS_BETWEEN_FRAMES); 67 68 return this; 69 } 70 71 /** 72 The render loop 73 */ 74 this.draw = function () 75 { 76 // calculate the time since the last frame 77 var thisFrame = new Date().getTime(); 78 var dt = (thisFrame - this.lastFrame)/1000; 79 this.lastFrame = thisFrame; 80 81 // clear the drawing contexts 82 this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height); 83 this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height); 84 85 // first update all the game objects 86 for (x in this.gameObjects) 87 { 88 if (this.gameObjects[x].update) 89 { 90 this.gameObjects[x].update(dt, this.backBufferContext2D, this.xScroll, this.yScroll); 91 } 92 } 93 94 // then draw the game objects 95 for (x in this.gameObjects) 96 { 97 if (this.gameObjects[x].draw) 98 { 99 this.gameObjects[x].draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll); 100 } 101 } 102 103 // copy the back buffer to the displayed canvas 104 this.context2D.drawImage(this.backBuffer, 0, 0); 105 }; 106 107 /** 108 Adds a new GameObject to the gameObjects collection 109 @param gameObject The object to add 110 */ 111 this.addGameObject = function(gameObject) 112 { 113 this.gameObjects.push(gameObject); 114 this.gameObjects.sort(function(a,b){return a.zOrder - b.zOrder;}) 115 }; 116 117 /** 118 Removes a GameObject from the gameObjects collection 119 @param gameObject The object to remove 120 */ 121 this.removeGameObject = function(gameObject) 122 { 123 this.gameObjects.removeObject(gameObject); 124 } 125 }