phaser/v3/merge/camera/Camera.js
2016-11-23 00:17:46 +00:00

337 lines
8.1 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}
*/
/**
* A Camera is your view into the game world. It has a position and size and renders only those objects within its field of view.
* The game automatically creates a single Stage sized camera on boot. Move the camera around the world with Phaser.Camera.x/y
*
* @class Phaser.Camera
* @constructor
* @param {Phaser.Game} game - Game reference to the currently running game.
* @param {number} id - Not being used at the moment, will be when Phaser supports multiple camera
* @param {number} x - Position of the camera on the X axis
* @param {number} y - Position of the camera on the Y axis
* @param {number} width - The width of the view rectangle
* @param {number} height - The height of the view rectangle
*/
Phaser.Camera = function (state, x, y, viewportWidth, viewportHeight)
{
/**
* The State that this Camera belongs to. A Camera can only belong to one State, and a State only
* has one Camera.
* @property {Phaser.State} state
*/
this.state = state;
/**
* @property {Phaser.Game} game - A reference to the currently running Game.
*/
this.game = state.game;
this.viewportWidth = viewportWidth;
this.viewportHeight = viewportHeight;
this.transform = new Phaser.Component.Transform(this, x, y);
/**
* The Camera is bound to this Rectangle and cannot move outside of it. By default it is enabled and set to the size of the World.
* The Rectangle can be located anywhere in the world and updated as often as you like. If you don't wish the Camera to be bound
* at all then set this to null. The values can be anything and are in World coordinates, with 0,0 being the top-left of the world.
*
* @property {Phaser.Rectangle} bounds - The Rectangle in which the Camera is bounded. Set to null to allow for movement anywhere.
*/
// this.bounds = new Phaser.Rectangle(x, y, width, height);
// this.bounds = new Phaser.Circle(x, y)
/**
* @property {boolean} atLimit - Whether this camera is flush with the World Bounds or not.
*/
this.atLimit = { x: false, y: false };
};
Phaser.Camera.prototype.constructor = Phaser.Camera;
Phaser.Camera.prototype = {
/**
* Method called to ensure the camera doesn't venture outside of the game world.
* Called automatically by Camera.update.
*
* @method Phaser.Camera#checkBounds
* @protected
*/
checkBounds: function ()
{
this.atLimit.x = false;
this.atLimit.y = false;
// var vx = this.view.x + this._shake.x;
// var vw = this.view.right + this._shake.x;
// var vy = this.view.y + this._shake.y;
// var vh = this.view.bottom + this._shake.y;
var vx = this.x;
var vw = this.x + this.viewportWidth;
var vy = this.y;
var vh = this.y + this.viewportHeight;
// Make sure we didn't go outside the cameras bounds
if (vx <= this.bounds.x * this.scale.x)
{
this.atLimit.x = true;
this.view.x = this.bounds.x * this.scale.x;
if (!this._shake.shakeBounds)
{
// The camera is up against the bounds, so reset the shake
this._shake.x = 0;
}
}
if (vw >= this.bounds.right * this.scale.x)
{
this.atLimit.x = true;
this.view.x = (this.bounds.right * this.scale.x) - this.width;
if (!this._shake.shakeBounds)
{
// The camera is up against the bounds, so reset the shake
this._shake.x = 0;
}
}
if (vy <= this.bounds.top * this.scale.y)
{
this.atLimit.y = true;
this.view.y = this.bounds.top * this.scale.y;
if (!this._shake.shakeBounds)
{
// The camera is up against the bounds, so reset the shake
this._shake.y = 0;
}
}
if (vh >= this.bounds.bottom * this.scale.y)
{
this.atLimit.y = true;
this.view.y = (this.bounds.bottom * this.scale.y) - this.height;
if (!this._shake.shakeBounds)
{
// The camera is up against the bounds, so reset the shake
this._shake.y = 0;
}
}
}
};
Object.defineProperties(Phaser.Camera.prototype, {
// Transform getters / setters
x: {
enumerable: true,
get: function ()
{
return this.transform._posX;
},
set: function (value)
{
this.transform._posX = value;
this.transform.dirty = true;
}
},
y: {
enumerable: true,
get: function ()
{
return this.transform._posY;
},
set: function (value)
{
this.transform._posY = value;
this.transform.dirty = true;
}
},
right: {
enumerable: true,
get: function ()
{
return this.transform._posX + (this.viewportWidth * this.transform._scaleX);
}
},
bottom: {
enumerable: true,
get: function ()
{
return this.transform._posY + (this.viewportHeight * this.transform._scaleY);
}
},
scale: {
enumerable: true,
get: function ()
{
return this.transform._scaleX;
},
set: function (value)
{
this.transform._scaleX = value;
this.transform._scaleY = value;
this.transform.dirty = true;
this.transform.updateCache();
}
},
scaleX: {
enumerable: true,
get: function ()
{
return this.transform._scaleX;
},
set: function (value)
{
this.transform._scaleX = value;
this.transform.dirty = true;
this.transform.updateCache();
}
},
scaleY: {
enumerable: true,
get: function ()
{
return this.transform._scaleY;
},
set: function (value)
{
this.transform._scaleY = value;
this.transform.dirty = true;
this.transform.updateCache();
}
},
pivotX: {
enumerable: true,
get: function ()
{
return this.transform._pivotX;
},
set: function (value)
{
this.transform._pivotX = value;
this.transform.dirty = true;
this.transform.updateCache();
}
},
pivotY: {
enumerable: true,
get: function ()
{
return this.transform._pivotY;
},
set: function (value)
{
this.transform._pivotY = value;
this.transform.dirty = true;
this.transform.updateCache();
}
},
angle: {
enumerable: true,
get: function ()
{
return Phaser.Math.wrapAngle(this.rotation * Phaser.Math.RAD_TO_DEG);
},
set: function (value)
{
this.rotation = Phaser.Math.wrapAngle(value) * Phaser.Math.DEG_TO_RAD;
}
},
rotation: {
enumerable: true,
get: function ()
{
return this.transform._rotation;
},
set: function (value)
{
if (this.transform._rotation === value)
{
return;
}
this.transform._rotation = value;
this.transform.dirty = true;
if (this.transform._rotation % Phaser.Math.PI2)
{
this.transform.cache.sr = Math.sin(this.transform._rotation);
this.transform.cache.cr = Math.cos(this.transform._rotation);
this.transform.updateCache();
this.transform.hasLocalRotation = true;
}
else
{
this.transform.hasLocalRotation = false;
}
}
}
});