2013-09-11 12:21:07 +00:00
|
|
|
/**
|
2013-09-19 11:17:49 +00:00
|
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
|
|
* @copyright 2013 Photon Storm Ltd.
|
2013-10-01 12:54:29 +00:00
|
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
2013-09-19 11:17:49 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2013-10-04 13:41:15 +00:00
|
|
|
* "This world is but a canvas to our imagination." - Henry David Thoreau
|
|
|
|
*
|
|
|
|
* A game has only one world. The world is an abstract place in which all game objects live. It is not bound
|
|
|
|
* by stage limits and can be any size. You look into the world via cameras. All game objects live within
|
|
|
|
* the world at world-based coordinates. By default a world is created the same size as your Stage.
|
|
|
|
*
|
|
|
|
* @class Phaser.World
|
2013-12-03 02:13:57 +00:00
|
|
|
* @extends Phaser.Group
|
2013-10-04 13:41:15 +00:00
|
|
|
* @constructor
|
|
|
|
* @param {Phaser.Game} game - Reference to the current game instance.
|
|
|
|
*/
|
2013-08-29 20:57:36 +00:00
|
|
|
Phaser.World = function (game) {
|
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
Phaser.Group.call(this, game, null, '__world', false);
|
|
|
|
|
2013-09-11 12:21:07 +00:00
|
|
|
/**
|
2013-10-04 13:41:15 +00:00
|
|
|
* The World has no fixed size, but it does have a bounds outside of which objects are no longer considered as being "in world" and you should use this to clean-up the display list and purge dead objects.
|
|
|
|
* By default we set the Bounds to be from 0,0 to Game.width,Game.height. I.e. it will match the size given to the game constructor with 0,0 representing the top-left of the display.
|
|
|
|
* However 0,0 is actually the center of the world, and if you rotate or scale the world all of that will happen from 0,0.
|
|
|
|
* So if you want to make a game in which the world itself will rotate you should adjust the bounds so that 0,0 is the center point, i.e. set them to -1000,-1000,2000,2000 for a 2000x2000 sized world centered around 0,0.
|
2013-11-25 03:13:04 +00:00
|
|
|
* @property {Phaser.Rectangle} bounds - Bound of this world that objects can not escape from.
|
|
|
|
*/
|
|
|
|
this.bounds = new Phaser.Rectangle(0, 0, game.width, game.height);
|
2013-09-10 19:40:34 +00:00
|
|
|
|
2013-09-11 12:21:07 +00:00
|
|
|
/**
|
2013-11-25 03:13:04 +00:00
|
|
|
* @property {Phaser.Camera} camera - Camera instance.
|
|
|
|
*/
|
|
|
|
this.camera = null;
|
2013-09-10 19:40:34 +00:00
|
|
|
|
2013-09-11 12:21:07 +00:00
|
|
|
/**
|
2013-11-25 03:13:04 +00:00
|
|
|
* @property {number} currentRenderOrderID - Reset each frame, keeps a count of the total number of objects updated.
|
|
|
|
*/
|
|
|
|
this.currentRenderOrderID = 0;
|
|
|
|
|
2013-08-29 20:57:36 +00:00
|
|
|
};
|
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
Phaser.World.prototype = Object.create(Phaser.Group.prototype);
|
|
|
|
Phaser.World.prototype.constructor = Phaser.World;
|
2013-08-29 20:57:36 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
/**
|
|
|
|
* Initialises the game world.
|
|
|
|
*
|
|
|
|
* @method Phaser.World#boot
|
|
|
|
* @protected
|
|
|
|
*/
|
|
|
|
Phaser.World.prototype.boot = function () {
|
2013-08-31 12:54:59 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
this.camera = new Phaser.Camera(this.game, 0, 0, 0, this.game.width, this.game.height);
|
2013-10-03 22:20:24 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
this.camera.displayObject = this._container;
|
2013-09-06 19:20:58 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
this.game.camera = this.camera;
|
2013-09-06 19:20:58 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
/**
|
|
|
|
* This is called automatically every frame, and is where main logic happens.
|
|
|
|
*
|
|
|
|
* @method Phaser.World#update
|
|
|
|
*/
|
2013-12-09 04:46:02 +00:00
|
|
|
Phaser.World.prototype.preUpdate = function () {
|
2013-11-19 05:29:02 +00:00
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
if (this.game.stage._stage.first._iNext)
|
|
|
|
{
|
|
|
|
var currentNode = this.game.stage._stage.first._iNext;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
2013-12-09 04:46:02 +00:00
|
|
|
// If preUpdate exists, and it returns false, skip PIXI child objects
|
|
|
|
if (currentNode['preUpdate'] && !currentNode.preUpdate())
|
2013-11-25 03:13:04 +00:00
|
|
|
{
|
2013-12-09 04:46:02 +00:00
|
|
|
currentNode = currentNode.last._iNext;
|
2014-01-28 01:29:35 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-12-09 04:46:02 +00:00
|
|
|
currentNode = currentNode._iNext;
|
2013-11-25 03:13:04 +00:00
|
|
|
}
|
|
|
|
|
2013-12-09 04:46:02 +00:00
|
|
|
}
|
|
|
|
while (currentNode != this.game.stage._stage.last._iNext)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is called automatically every frame, and is where main logic happens.
|
|
|
|
*
|
|
|
|
* @method Phaser.World#update
|
|
|
|
*/
|
|
|
|
Phaser.World.prototype.update = function () {
|
|
|
|
|
|
|
|
this.currentRenderOrderID = 0;
|
|
|
|
|
|
|
|
if (this.game.stage._stage.first._iNext)
|
|
|
|
{
|
|
|
|
var currentNode = this.game.stage._stage.first._iNext;
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
// If update exists, and it returns false, skip PIXI child objects
|
|
|
|
if (currentNode['update'] && !currentNode.update())
|
2013-11-19 05:29:02 +00:00
|
|
|
{
|
|
|
|
currentNode = currentNode.last._iNext;
|
2014-01-28 01:29:35 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-11-21 05:31:23 +00:00
|
|
|
currentNode = currentNode._iNext;
|
2013-11-19 05:29:02 +00:00
|
|
|
}
|
2013-11-25 03:13:04 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
while (currentNode != this.game.stage._stage.last._iNext)
|
|
|
|
}
|
2013-09-03 16:28:12 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
}
|
2013-09-03 16:28:12 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
/**
|
|
|
|
* This is called automatically every frame, and is where main logic happens.
|
|
|
|
* @method Phaser.World#postUpdate
|
|
|
|
*/
|
|
|
|
Phaser.World.prototype.postUpdate = function () {
|
2013-09-23 00:06:09 +00:00
|
|
|
|
2013-12-01 01:40:24 +00:00
|
|
|
this.camera.update();
|
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
if (this.game.stage._stage.first._iNext)
|
|
|
|
{
|
|
|
|
var currentNode = this.game.stage._stage.first._iNext;
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
do
|
2013-09-23 00:06:09 +00:00
|
|
|
{
|
2013-10-04 15:51:24 +00:00
|
|
|
if (currentNode['postUpdate'])
|
2013-09-23 00:06:09 +00:00
|
|
|
{
|
2013-10-04 15:51:24 +00:00
|
|
|
currentNode.postUpdate();
|
2013-09-23 00:06:09 +00:00
|
|
|
}
|
2013-10-04 15:51:24 +00:00
|
|
|
|
|
|
|
currentNode = currentNode._iNext;
|
2013-09-23 00:06:09 +00:00
|
|
|
}
|
2013-10-04 15:51:24 +00:00
|
|
|
while (currentNode != this.game.stage._stage.last._iNext)
|
|
|
|
}
|
2014-01-31 02:06:45 +00:00
|
|
|
|
|
|
|
this.camera.update();
|
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
}
|
2013-09-23 00:06:09 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
/**
|
|
|
|
* Updates the size of this world. Note that this doesn't modify the world x/y coordinates, just the width and height.
|
2013-12-06 04:34:27 +00:00
|
|
|
*
|
2013-10-09 03:31:08 +00:00
|
|
|
* @method Phaser.World#setBounds
|
|
|
|
* @param {number} x - Top left most corner of the world.
|
|
|
|
* @param {number} y - Top left most corner of the world.
|
2013-10-04 15:51:24 +00:00
|
|
|
* @param {number} width - New width of the world.
|
|
|
|
* @param {number} height - New height of the world.
|
|
|
|
*/
|
|
|
|
Phaser.World.prototype.setBounds = function (x, y, width, height) {
|
2013-08-29 20:57:36 +00:00
|
|
|
|
2014-01-29 17:10:13 +00:00
|
|
|
if (width < this.game.width)
|
|
|
|
{
|
|
|
|
width = this.game.width;
|
|
|
|
}
|
2013-12-06 04:34:27 +00:00
|
|
|
|
2014-01-29 17:10:13 +00:00
|
|
|
if (height < this.game.height)
|
|
|
|
{
|
|
|
|
height = this.game.height;
|
|
|
|
}
|
2013-12-06 04:34:27 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
this.bounds.setTo(x, y, width, height);
|
2013-08-29 20:57:36 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
if (this.camera.bounds)
|
|
|
|
{
|
2013-12-06 04:34:27 +00:00
|
|
|
// The Camera can never be smaller than the game size
|
2013-10-04 15:51:24 +00:00
|
|
|
this.camera.bounds.setTo(x, y, width, height);
|
|
|
|
}
|
2013-09-13 04:44:04 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
}
|
2013-09-13 04:44:04 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
/**
|
|
|
|
* Destroyer of worlds.
|
|
|
|
* @method Phaser.World#destroy
|
|
|
|
*/
|
|
|
|
Phaser.World.prototype.destroy = function () {
|
2013-09-13 04:44:04 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
this.camera.x = 0;
|
|
|
|
this.camera.y = 0;
|
2013-09-13 04:44:04 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
this.game.input.reset(true);
|
2013-09-13 04:44:04 +00:00
|
|
|
|
2013-10-04 15:51:24 +00:00
|
|
|
this.removeAll();
|
|
|
|
|
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
2013-10-01 12:54:29 +00:00
|
|
|
/**
|
2013-10-02 11:11:22 +00:00
|
|
|
* @name Phaser.World#width
|
|
|
|
* @property {number} width - Gets or sets the current width of the game world.
|
2013-10-01 12:54:29 +00:00
|
|
|
*/
|
2013-08-29 20:57:36 +00:00
|
|
|
Object.defineProperty(Phaser.World.prototype, "width", {
|
|
|
|
|
|
|
|
get: function () {
|
|
|
|
return this.bounds.width;
|
|
|
|
},
|
|
|
|
|
|
|
|
set: function (value) {
|
|
|
|
this.bounds.width = value;
|
2013-09-11 12:21:07 +00:00
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-10-01 12:54:29 +00:00
|
|
|
/**
|
2013-10-02 11:11:22 +00:00
|
|
|
* @name Phaser.World#height
|
|
|
|
* @property {number} height - Gets or sets the current height of the game world.
|
2013-10-01 12:54:29 +00:00
|
|
|
*/
|
2013-08-29 20:57:36 +00:00
|
|
|
Object.defineProperty(Phaser.World.prototype, "height", {
|
|
|
|
|
|
|
|
get: function () {
|
|
|
|
return this.bounds.height;
|
|
|
|
},
|
|
|
|
|
|
|
|
set: function (value) {
|
|
|
|
this.bounds.height = value;
|
2013-09-11 12:21:07 +00:00
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-10-01 12:54:29 +00:00
|
|
|
/**
|
2013-10-02 11:11:22 +00:00
|
|
|
* @name Phaser.World#centerX
|
|
|
|
* @property {number} centerX - Gets the X position corresponding to the center point of the world.
|
|
|
|
* @readonly
|
2013-10-01 12:54:29 +00:00
|
|
|
*/
|
2013-08-29 20:57:36 +00:00
|
|
|
Object.defineProperty(Phaser.World.prototype, "centerX", {
|
|
|
|
|
|
|
|
get: function () {
|
|
|
|
return this.bounds.halfWidth;
|
2013-09-11 12:21:07 +00:00
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-10-01 12:54:29 +00:00
|
|
|
/**
|
2013-10-02 11:11:22 +00:00
|
|
|
* @name Phaser.World#centerY
|
|
|
|
* @property {number} centerY - Gets the Y position corresponding to the center point of the world.
|
|
|
|
* @readonly
|
2013-10-01 12:54:29 +00:00
|
|
|
*/
|
2013-08-29 20:57:36 +00:00
|
|
|
Object.defineProperty(Phaser.World.prototype, "centerY", {
|
|
|
|
|
|
|
|
get: function () {
|
|
|
|
return this.bounds.halfHeight;
|
2013-09-11 12:21:07 +00:00
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-10-01 12:54:29 +00:00
|
|
|
/**
|
2013-10-02 11:11:22 +00:00
|
|
|
* @name Phaser.World#randomX
|
|
|
|
* @property {number} randomX - Gets a random integer which is lesser than or equal to the current width of the game world.
|
|
|
|
* @readonly
|
2013-10-01 12:54:29 +00:00
|
|
|
*/
|
2013-08-29 20:57:36 +00:00
|
|
|
Object.defineProperty(Phaser.World.prototype, "randomX", {
|
|
|
|
|
|
|
|
get: function () {
|
2013-10-09 06:11:36 +00:00
|
|
|
|
|
|
|
if (this.bounds.x < 0)
|
|
|
|
{
|
|
|
|
return this.game.rnd.integerInRange(this.bounds.x, (this.bounds.width - Math.abs(this.bounds.x)));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return this.game.rnd.integerInRange(this.bounds.x, this.bounds.width);
|
|
|
|
}
|
|
|
|
|
2013-09-11 12:21:07 +00:00
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-10-01 12:54:29 +00:00
|
|
|
/**
|
2013-10-02 11:11:22 +00:00
|
|
|
* @name Phaser.World#randomY
|
|
|
|
* @property {number} randomY - Gets a random integer which is lesser than or equal to the current height of the game world.
|
|
|
|
* @readonly
|
2013-10-01 12:54:29 +00:00
|
|
|
*/
|
2013-08-29 20:57:36 +00:00
|
|
|
Object.defineProperty(Phaser.World.prototype, "randomY", {
|
|
|
|
|
|
|
|
get: function () {
|
2013-10-09 06:11:36 +00:00
|
|
|
|
|
|
|
if (this.bounds.y < 0)
|
|
|
|
{
|
|
|
|
return this.game.rnd.integerInRange(this.bounds.y, (this.bounds.height - Math.abs(this.bounds.y)));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return this.game.rnd.integerInRange(this.bounds.y, this.bounds.height);
|
|
|
|
}
|
|
|
|
|
2013-09-11 12:21:07 +00:00
|
|
|
}
|
2013-08-29 20:57:36 +00:00
|
|
|
|
|
|
|
});
|
2013-11-04 20:43:59 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @name Phaser.World#visible
|
|
|
|
* @property {boolean} visible - Gets or sets the visible state of the World.
|
|
|
|
*/
|
|
|
|
Object.defineProperty(Phaser.World.prototype, "visible", {
|
|
|
|
|
|
|
|
get: function () {
|
|
|
|
return this._container.visible;
|
|
|
|
},
|
|
|
|
|
|
|
|
set: function (value) {
|
|
|
|
this._container.visible = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|