UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

502 lines (437 loc) 13.6 kB
/** * @author Richard Davey <rich@phaser.io> * @copyright 2013-2025 Phaser Studio Inc. * @license {@link https://opensource.org/licenses/MIT|MIT License} */ var Class = require('../../utils/Class'); var GetValue = require('../../utils/object/GetValue'); /** * @classdesc * A Smoothed Key Camera Control. * * This allows you to control the movement and zoom of a camera using the defined keys. * Unlike the Fixed Camera Control you can also provide physics values for acceleration, drag and maxSpeed for smoothing effects. * * ```javascript * var controlConfig = { * camera: this.cameras.main, * left: cursors.left, * right: cursors.right, * up: cursors.up, * down: cursors.down, * zoomIn: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Q), * zoomOut: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.E), * zoomSpeed: 0.02, * acceleration: 0.06, * drag: 0.0005, * maxSpeed: 1.0 * }; * ``` * * You must call the `update` method of this controller every frame. * * @class SmoothedKeyControl * @memberof Phaser.Cameras.Controls * @constructor * @since 3.0.0 * * @param {Phaser.Types.Cameras.Controls.SmoothedKeyControlConfig} config - The Smoothed Key Control configuration object. */ var SmoothedKeyControl = new Class({ initialize: function SmoothedKeyControl (config) { /** * The Camera that this Control will update. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#camera * @type {?Phaser.Cameras.Scene2D.Camera} * @default null * @since 3.0.0 */ this.camera = GetValue(config, 'camera', null); /** * The Key to be pressed that will move the Camera left. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#left * @type {?Phaser.Input.Keyboard.Key} * @default null * @since 3.0.0 */ this.left = GetValue(config, 'left', null); /** * The Key to be pressed that will move the Camera right. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#right * @type {?Phaser.Input.Keyboard.Key} * @default null * @since 3.0.0 */ this.right = GetValue(config, 'right', null); /** * The Key to be pressed that will move the Camera up. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#up * @type {?Phaser.Input.Keyboard.Key} * @default null * @since 3.0.0 */ this.up = GetValue(config, 'up', null); /** * The Key to be pressed that will move the Camera down. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#down * @type {?Phaser.Input.Keyboard.Key} * @default null * @since 3.0.0 */ this.down = GetValue(config, 'down', null); /** * The Key to be pressed that will zoom the Camera in. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomIn * @type {?Phaser.Input.Keyboard.Key} * @default null * @since 3.0.0 */ this.zoomIn = GetValue(config, 'zoomIn', null); /** * The Key to be pressed that will zoom the Camera out. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomOut * @type {?Phaser.Input.Keyboard.Key} * @default null * @since 3.0.0 */ this.zoomOut = GetValue(config, 'zoomOut', null); /** * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomSpeed * @type {number} * @default 0.01 * @since 3.0.0 */ this.zoomSpeed = GetValue(config, 'zoomSpeed', 0.01); /** * The smallest zoom value the camera will reach when zoomed out. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#minZoom * @type {number} * @default 0.001 * @since 3.53.0 */ this.minZoom = GetValue(config, 'minZoom', 0.001); /** * The largest zoom value the camera will reach when zoomed in. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#maxZoom * @type {number} * @default 1000 * @since 3.53.0 */ this.maxZoom = GetValue(config, 'maxZoom', 1000); /** * The horizontal acceleration the camera will move. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#accelX * @type {number} * @default 0 * @since 3.0.0 */ this.accelX = 0; /** * The vertical acceleration the camera will move. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#accelY * @type {number} * @default 0 * @since 3.0.0 */ this.accelY = 0; var accel = GetValue(config, 'acceleration', null); if (typeof accel === 'number') { this.accelX = accel; this.accelY = accel; } else { this.accelX = GetValue(config, 'acceleration.x', 0); this.accelY = GetValue(config, 'acceleration.y', 0); } /** * The horizontal drag applied to the camera when it is moving. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#dragX * @type {number} * @default 0 * @since 3.0.0 */ this.dragX = 0; /** * The vertical drag applied to the camera when it is moving. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#dragY * @type {number} * @default 0 * @since 3.0.0 */ this.dragY = 0; var drag = GetValue(config, 'drag', null); if (typeof drag === 'number') { this.dragX = drag; this.dragY = drag; } else { this.dragX = GetValue(config, 'drag.x', 0); this.dragY = GetValue(config, 'drag.y', 0); } /** * The maximum horizontal speed the camera will move. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#maxSpeedX * @type {number} * @default 0 * @since 3.0.0 */ this.maxSpeedX = 0; /** * The maximum vertical speed the camera will move. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#maxSpeedY * @type {number} * @default 0 * @since 3.0.0 */ this.maxSpeedY = 0; var maxSpeed = GetValue(config, 'maxSpeed', null); if (typeof maxSpeed === 'number') { this.maxSpeedX = maxSpeed; this.maxSpeedY = maxSpeed; } else { this.maxSpeedX = GetValue(config, 'maxSpeed.x', 0); this.maxSpeedY = GetValue(config, 'maxSpeed.y', 0); } /** * Internal property to track the speed of the control. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#_speedX * @type {number} * @private * @default 0 * @since 3.0.0 */ this._speedX = 0; /** * Internal property to track the speed of the control. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#_speedY * @type {number} * @private * @default 0 * @since 3.0.0 */ this._speedY = 0; /** * Internal property to track the zoom of the control. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#_zoom * @type {number} * @private * @default 0 * @since 3.0.0 */ this._zoom = 0; /** * A flag controlling if the Controls will update the Camera or not. * * @name Phaser.Cameras.Controls.SmoothedKeyControl#active * @type {boolean} * @since 3.0.0 */ this.active = (this.camera !== null); }, /** * Starts the Key Control running, providing it has been linked to a camera. * * @method Phaser.Cameras.Controls.SmoothedKeyControl#start * @since 3.0.0 * * @return {this} This Key Control instance. */ start: function () { this.active = (this.camera !== null); return this; }, /** * Stops this Key Control from running. Call `start` to start it again. * * @method Phaser.Cameras.Controls.SmoothedKeyControl#stop * @since 3.0.0 * * @return {this} This Key Control instance. */ stop: function () { this.active = false; return this; }, /** * Binds this Key Control to a camera. * * @method Phaser.Cameras.Controls.SmoothedKeyControl#setCamera * @since 3.0.0 * * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera to bind this Key Control to. * * @return {this} This Key Control instance. */ setCamera: function (camera) { this.camera = camera; return this; }, /** * Applies the results of pressing the control keys to the Camera. * * You must call this every step, it is not called automatically. * * @method Phaser.Cameras.Controls.SmoothedKeyControl#update * @since 3.0.0 * * @param {number} delta - The delta time in ms since the last frame. This is a smoothed and capped value based on the FPS rate. */ update: function (delta) { if (!this.active) { return; } if (delta === undefined) { delta = 1; } var cam = this.camera; // Apply Deceleration if (this._speedX > 0) { this._speedX -= this.dragX * delta; if (this._speedX < 0) { this._speedX = 0; } } else if (this._speedX < 0) { this._speedX += this.dragX * delta; if (this._speedX > 0) { this._speedX = 0; } } if (this._speedY > 0) { this._speedY -= this.dragY * delta; if (this._speedY < 0) { this._speedY = 0; } } else if (this._speedY < 0) { this._speedY += this.dragY * delta; if (this._speedY > 0) { this._speedY = 0; } } // Check for keys if (this.up && this.up.isDown) { this._speedY += this.accelY; if (this._speedY > this.maxSpeedY) { this._speedY = this.maxSpeedY; } } else if (this.down && this.down.isDown) { this._speedY -= this.accelY; if (this._speedY < -this.maxSpeedY) { this._speedY = -this.maxSpeedY; } } if (this.left && this.left.isDown) { this._speedX += this.accelX; if (this._speedX > this.maxSpeedX) { this._speedX = this.maxSpeedX; } } else if (this.right && this.right.isDown) { this._speedX -= this.accelX; if (this._speedX < -this.maxSpeedX) { this._speedX = -this.maxSpeedX; } } // Camera zoom if (this.zoomIn && this.zoomIn.isDown) { this._zoom = -this.zoomSpeed; } else if (this.zoomOut && this.zoomOut.isDown) { this._zoom = this.zoomSpeed; } else { this._zoom = 0; } // Apply to Camera if (this._speedX !== 0) { cam.scrollX -= ((this._speedX * delta) | 0); } if (this._speedY !== 0) { cam.scrollY -= ((this._speedY * delta) | 0); } if (this._zoom !== 0) { cam.zoom += this._zoom; if (cam.zoom < this.minZoom) { cam.zoom = this.minZoom; } else if (cam.zoom > this.maxZoom) { cam.zoom = this.maxZoom; } } }, /** * Destroys this Key Control. * * @method Phaser.Cameras.Controls.SmoothedKeyControl#destroy * @since 3.0.0 */ destroy: function () { this.camera = null; this.left = null; this.right = null; this.up = null; this.down = null; this.zoomIn = null; this.zoomOut = null; } }); module.exports = SmoothedKeyControl;