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 }