/**
* @author Inateno / http://inateno.com / http://dreamirl.com
*/
/* TODO - I was working on physic system by adding "colliders" and grids stuff inside the Scene
* but I'm still working on */
/**
* @constructor Scene
* @class a Scene is a world. You push GameObjects inside this world.
* There is no world Size, just objects inside
* @example Game.scene = new DE.Scene( "Test" );
*/
define( [ 'DE.CONFIG', 'DE.COLORS', 'DE.GameObject', 'DE.Time', 'DE.MainLoop', 'DE.Event' ],
function( CONFIG, COLORS, GameObject, Time, MainLoop, Event )
{
function Scene( name )
{
this.name = name || "NoName-" + ( Date.now() + Math.random() * Date.now() >> 0 );
this.gameObjects= new Array();
// physics attributes by using an octree with colliders inside
/*this.colliders = new Array();
this.maxObjectsPerGrid = 5;
this.grid = new Array(); // TODO - octree for collisions ? WIP
this.maxGrids = 1*/
/*this.cameras = new Array();
this.maxCameras = 0;*/
// if this world is sleeping, update will be ignored
this.sleep = false;
this.maxObjects = 0;
this.tickers = new Array(); // tickers can be stored in the world directly
this.onGlobalMouseDown = {};
this.onLastGlobalMouseDown = {};
this.onGlobalMouseMove = {};
this.onLastGlobalMouseMove = {};
this.onGlobalMouseUp = {};
this.onLastGlobalMouseUp = {};
this.onGlobalMouseClick = {};
this.onLastGlobalMouseClick = {};
/****
* init@void
add this scene in the MainLoop
*/
this.init = function()
{
MainLoop.addScene( this );
}
/****
* update@void
call update from all objects
*/
this.update = function()
{
if ( this.sleep )
return;
for ( var i = 0, t = this.gameObjects.length, g; i < t; ++i )
{
g = this.gameObjects[ i ];
if ( !g )
continue;
if ( g.flag !== null )
{
switch( g.flag )
{
case "delete":
this.delete( i );
--t;
continue;
break;
}
}
// need an octree here for physic ?
// passing other gameObjects for physic ? (still looking how to do it)
g.update( Time.currentTime/*, this.gameObjects*/ );
}
// independant ticker for time counting
for ( var i = 0, t = this.tickers.length; i < t; ++tk )
{
this.tickers[ i ].update();
}
if ( this.waitSortGameObjects )
this.sortGameObjects();
}
/****
* sortGameObjects@void
sort gameObjects in the world depend on z axe and z-index
*/
this.sortGameObjects = function()
{
this.gameObjects.sort( function( a, b )
{
if ( b.position.z == a.position.z )
return a.zindex - b.zindex;
return b.position.z - a.position.z;
} );
for ( var i = 0, go; go = this.gameObjects[ i ]; ++i )
go.sortChildrens();
this.waitSortGameObjects = false;
}
/****
* add@void
add an object in this scene
*/
this.add = function( gameObject )
{
if ( !( gameObject instanceof GameObject ) )
{
CONFIG.debug.log( "%cIt's not or not herits from a GameObjects", 1, "color:red" );
return;
}
gameObject.scene = this;
this.gameObjects.push( gameObject );
// nope, when sort the scene this is not correct anymore
// gameObject.sceneIndex = this.maxObjects;
++this.maxObjects;
this.waitSortGameObjects = true;
}
Event.addEventComponents( this );
this.init();
}
Scene.prototype = Scene.prototype || {};
Event.addEventCapabilities( Scene );
/**
* remove global events binded
* @memberOf Scene
* @protected
* @param {GameObject} object
*/
Scene.prototype.cleanObjectBinding = function( object )
{
delete this.onGlobalMouseDown[ object.id ];
delete this.onLastGlobalMouseDown[ object.id ];
delete this.onGlobalMouseMove[ object.id ];
delete this.onLastGlobalMouseMove[ object.id ];
delete this.onGlobalMouseUp[ object.id ];
delete this.onLastGlobalMouseUp[ object.id ];
};
/****
* remove@void
remove an object on this scene ( not deleted ! )
*/
Scene.prototype.remove = function( object )
{
this.cleanObjectBinding( object );
if ( this.gameObjects[ object ] )
{
this.gameObjects.splice( object, 1 );
}
else
{
var pos = this.gameObjects.indexOf( object );
if ( pos == -1 )
{
CONFIG.debug.log( "%cRemove gameObject not found", 1, "color:orange", object );
return;
}
this.gameObjects.splice( pos, 1 );
// this.gameObjects.splice( object.sceneIndex, 1 ); // nope sceneIndex can change
}
this.maxObjects--;
}
/****
* delete@void
delete and remove an object in the scene
*/
Scene.prototype.delete = function( object )
{
// if its an index
if ( this.gameObjects[ object ] )
this.gameObjects[ object ].killMePlease();
else
object.killMePlease();
this.remove( object );
}
/****
* deleteAll@void
delete and remove all gameObjects in the scene
*/
Scene.prototype.deleteAll = function()
{
var objs = this.gameObjects;
while ( objs.length > 0 )
this.delete( 0 );
this.maxObjects = 0;
}
Scene.prototype.DEName = "Scene";
CONFIG.debug.log( "Scene loaded", 3 );
return Scene;
} );