/** * @author Richard Davey * @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; } } } });