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 }