mirror of
https://github.com/photonstorm/phaser
synced 2024-12-24 20:13:35 +00:00
139 lines
4.2 KiB
JavaScript
139 lines
4.2 KiB
JavaScript
/**
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
* @copyright 2016 Photon Storm Ltd.
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
|
*/
|
|
|
|
/**
|
|
* The InWorld component checks if a Game Object is within the Game World Bounds.
|
|
* An object is considered as being "in bounds" so long as its own bounds intersects at any point with the World bounds.
|
|
* If the AutoCull component is enabled on the Game Object then it will check the Game Object against the Camera bounds as well.
|
|
*
|
|
* @class
|
|
*/
|
|
Phaser.Component.InWorld = function () {};
|
|
|
|
/**
|
|
* The InWorld component preUpdate handler.
|
|
* Called automatically by the Game Object.
|
|
*
|
|
* @method
|
|
*/
|
|
Phaser.Component.InWorld.preUpdate = function () {
|
|
|
|
// Cache the bounds if we need it
|
|
if (this.autoCull || this.checkWorldBounds)
|
|
{
|
|
this._bounds.copyFrom(this.getBounds());
|
|
|
|
this._bounds.x += this.game.camera.view.x;
|
|
this._bounds.y += this.game.camera.view.y;
|
|
|
|
if (this.autoCull)
|
|
{
|
|
// Won't get rendered but will still get its transform updated
|
|
if (this.game.world.camera.view.intersects(this._bounds))
|
|
{
|
|
this.renderable = true;
|
|
this.game.world.camera.totalInView++;
|
|
}
|
|
else
|
|
{
|
|
this.renderable = false;
|
|
|
|
if (this.outOfCameraBoundsKill)
|
|
{
|
|
this.kill();
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.checkWorldBounds)
|
|
{
|
|
// The Sprite is already out of the world bounds, so let's check to see if it has come back again
|
|
if (this._outOfBoundsFired && this.game.world.bounds.intersects(this._bounds))
|
|
{
|
|
this._outOfBoundsFired = false;
|
|
this.events.onEnterBounds$dispatch(this);
|
|
}
|
|
else if (!this._outOfBoundsFired && !this.game.world.bounds.intersects(this._bounds))
|
|
{
|
|
// The Sprite WAS in the screen, but has now left.
|
|
this._outOfBoundsFired = true;
|
|
this.events.onOutOfBounds$dispatch(this);
|
|
|
|
if (this.outOfBoundsKill)
|
|
{
|
|
this.kill();
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
Phaser.Component.InWorld.prototype = {
|
|
|
|
/**
|
|
* If this is set to `true` the Game Object checks if it is within the World bounds each frame.
|
|
*
|
|
* When it is no longer intersecting the world bounds it dispatches the `onOutOfBounds` event.
|
|
*
|
|
* If it was *previously* out of bounds but is now intersecting the world bounds again it dispatches the `onEnterBounds` event.
|
|
*
|
|
* It also optionally kills the Game Object if `outOfBoundsKill` is `true`.
|
|
*
|
|
* When `checkWorldBounds` is enabled it forces the Game Object to calculate its full bounds every frame.
|
|
*
|
|
* This is a relatively expensive operation, especially if enabled on hundreds of Game Objects. So enable it only if you know it's required,
|
|
* or you have tested performance and find it acceptable.
|
|
*
|
|
* @property {boolean} checkWorldBounds
|
|
* @default
|
|
*/
|
|
checkWorldBounds: false,
|
|
|
|
/**
|
|
* If this and the `checkWorldBounds` property are both set to `true` then the `kill` method is called as soon as `inWorld` returns false.
|
|
*
|
|
* @property {boolean} outOfBoundsKill
|
|
* @default
|
|
*/
|
|
outOfBoundsKill: false,
|
|
|
|
/**
|
|
* If this and the `autoCull` property are both set to `true`, then the `kill` method
|
|
* is called as soon as the Game Object leaves the camera bounds.
|
|
*
|
|
* @property {boolean} outOfCameraBoundsKill
|
|
* @default
|
|
*/
|
|
outOfCameraBoundsKill: false,
|
|
|
|
/**
|
|
* @property {boolean} _outOfBoundsFired - Internal state var.
|
|
* @private
|
|
*/
|
|
_outOfBoundsFired: false,
|
|
|
|
/**
|
|
* Checks if the Game Objects bounds are within, or intersect at any point with the Game World bounds.
|
|
*
|
|
* @property {boolean} inWorld
|
|
* @readonly
|
|
*/
|
|
inWorld: {
|
|
|
|
get: function () {
|
|
|
|
return this.game.world.bounds.intersects(this.getBounds());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|