phaser/src/input/Pointer.js

691 lines
16 KiB
JavaScript
Raw Normal View History

2018-02-12 16:01:20 +00:00
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2018 Photon Storm Ltd.
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
*/
var Class = require('../utils/Class');
var Vector2 = require('../math/Vector2');
2018-01-26 12:43:34 +00:00
// DOM event button value:
2017-07-27 02:40:58 +00:00
// A number representing a given button:
// 0: Main button pressed, usually the left button or the un-initialized state
// 1: Auxiliary button pressed, usually the wheel button or the middle button (if present)
// 2: Secondary button pressed, usually the right button
// 3: Fourth button, typically the Browser Back button
// 4: Fifth button, typically the Browser Forward button
// For a mouse configured for left-handed use, the button actions are reversed. In this case, the values are read from right to left.
2018-02-07 15:27:21 +00:00
/**
* @classdesc
* [description]
*
* @class Pointer
* @memberOf Phaser.Input
* @constructor
* @since 3.0.0
*
* @param {Phaser.Input.InputManager} manager - [description]
* @param {integer} id - [description]
*/
var Pointer = new Class({
initialize:
function Pointer (manager, id)
{
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#manager
* @type {Phaser.Input.InputManager}
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*/
this.manager = manager;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#id
* @type {integer}
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*/
this.id = id;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#event
* @type {any}
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*/
this.event;
2018-01-26 12:43:34 +00:00
/**
* The camera the Pointer interacted with during its last update.
* A Pointer can only ever interact with one camera at once, which will be the top-most camera
* in the list should multiple cameras be positioned on-top of each other.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#camera
* @type {Phaser.Cameras.Scene2D.Camera}
2018-01-26 12:43:34 +00:00
* @default null
* @since 3.0.0
*/
this.camera = null;
2018-01-26 12:43:34 +00:00
/**
* 0: No button or un-initialized
* 1: Left button
* 2: Right button
* 4: Wheel button or middle button
* 8: 4th button (typically the "Browser Back" button)
* 16: 5th button (typically the "Browser Forward" button)
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#buttons
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
this.buttons = 0;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#position
* @type {Phaser.Math.Vector2}
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*/
this.position = new Vector2();
/**
* The x position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
*
* @name Phaser.Input.Pointer#worldX
* @type {number}
* @default 0
* @since 3.10.0
*/
this.worldX = 0;
/**
* The y position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
*
* @name Phaser.Input.Pointer#worldY
* @type {number}
* @default 0
* @since 3.10.0
*/
this.worldY = 0;
2018-01-26 12:43:34 +00:00
/**
* X coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#downX
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.downX = 0;
2018-01-26 12:43:34 +00:00
/**
* Y coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#downY
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.downY = 0;
2018-01-26 12:43:34 +00:00
/**
* Time when Button 1 (left button), or Touch, was pressed, used for dragging objects.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#downTime
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.downTime = 0;
2018-01-26 12:43:34 +00:00
/**
* X coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#upX
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.upX = 0;
2018-01-26 12:43:34 +00:00
/**
* Y coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#upY
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.upY = 0;
2018-01-26 12:43:34 +00:00
/**
* Time when Button 1 (left button), or Touch, was released, used for dragging objects.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#upTime
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.upTime = 0;
2018-01-26 12:43:34 +00:00
/**
* Is the primary button down? (usually button 0, the left mouse button)
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#primaryDown
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.primaryDown = false;
2018-01-26 12:43:34 +00:00
/**
* The Drag State of the Pointer:
2018-03-19 12:43:19 +00:00
*
2018-01-26 12:43:34 +00:00
* 0 = Not dragging anything
* 1 = Being checked if dragging
* 2 = Dragging something
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#dragState
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
2017-07-27 02:40:58 +00:00
this.dragState = 0;
2018-01-26 12:43:34 +00:00
/**
* Is _any_ button on this pointer considered as being down?
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#isDown
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
this.isDown = false;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#dirty
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
this.dirty = false;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#justDown
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
this.justDown = false;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#justUp
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
this.justUp = false;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#justMoved
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
this.justMoved = false;
2018-01-26 12:43:34 +00:00
/**
* Did the previous input event come from a Touch input (true) or Mouse? (false)
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#wasTouch
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
this.wasTouch = false;
/**
2018-01-26 12:43:34 +00:00
* If the mouse is locked, the horizontal relative movement of the Pointer in pixels since last frame.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#movementX
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
this.movementX = 0;
/**
2018-01-26 12:43:34 +00:00
* If the mouse is locked, the vertical relative movement of the Pointer in pixels since last frame.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Pointer#movementY
* @type {number}
2018-01-26 12:43:34 +00:00
* @default 0
* @since 3.0.0
*/
this.movementY = 0;
/**
* The identifier property of the Pointer as set by the DOM event when this Pointer is started.
*
* @name Phaser.Input.Pointer#identifier
* @type {number}
* @since 3.10.0
*/
this.identifier = 0;
/**
* The pointerId property of the Pointer as set by the DOM event when this Pointer is started.
* The browser can and will recycle this value.
*
* @name Phaser.Input.Pointer#pointerId
* @type {number}
* @since 3.10.0
*/
this.pointerId = null;
/**
* An active Pointer is one that is currently pressed down on the display.
* A Mouse is always considered as active.
*
* @name Phaser.Input.Pointer#active
* @type {boolean}
* @since 3.10.0
*/
this.active = (id === 0) ? true : false;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#positionToCamera
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
2018-04-04 13:43:53 +00:00
* @param {(Phaser.Math.Vector2|object)} [output] - [description]
2018-01-26 12:43:34 +00:00
*
* @return {(Phaser.Math.Vector2|object)} [description]
2018-01-26 12:43:34 +00:00
*/
positionToCamera: function (camera, output)
{
return camera.getWorldPoint(this.x, this.y, output);
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#reset
* @since 3.0.0
*/
reset: function ()
{
this.dirty = false;
this.justDown = false;
this.justUp = false;
this.justMoved = false;
this.movementX = 0;
this.movementY = 0;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#up
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*
* @param {MouseEvent} event - [description]
2018-03-18 13:43:37 +00:00
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
2018-01-26 12:43:34 +00:00
*/
up: function (event, time)
{
if (event.buttons)
{
this.buttons = event.buttons;
}
this.event = event;
this.x = this.manager.transformX(event.pageX);
this.y = this.manager.transformY(event.pageY);
// 0: Main button pressed, usually the left button or the un-initialized state
if (event.button === 0)
{
this.primaryDown = false;
this.upX = this.x;
this.upY = this.y;
this.upTime = time;
}
this.justUp = true;
this.isDown = false;
this.dirty = true;
this.wasTouch = false;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#down
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {MouseEvent} event - [description]
2018-03-18 13:43:37 +00:00
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
2018-01-26 12:43:34 +00:00
*/
down: function (event, time)
{
if (event.buttons)
{
this.buttons = event.buttons;
}
this.event = event;
this.x = this.manager.transformX(event.pageX);
this.y = this.manager.transformY(event.pageY);
// 0: Main button pressed, usually the left button or the un-initialized state
if (event.button === 0)
{
this.primaryDown = true;
this.downX = this.x;
this.downY = this.y;
this.downTime = time;
}
this.justDown = true;
this.isDown = true;
2017-07-18 16:22:14 +00:00
this.dirty = true;
this.wasTouch = false;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#move
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {MouseEvent} event - [description]
2018-03-18 13:43:37 +00:00
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
2018-01-26 12:43:34 +00:00
*/
move: function (event)
{
if (event.buttons)
{
this.buttons = event.buttons;
}
this.event = event;
this.x = this.manager.transformX(event.pageX);
this.y = this.manager.transformY(event.pageY);
if (this.manager.mouse.locked)
2017-07-27 02:40:58 +00:00
{
// Multiple DOM events may occur within one frame, but only one Phaser event will fire
this.movementX += event.movementX || event.mozMovementX || event.webkitMovementX || 0;
this.movementY += event.movementY || event.mozMovementY || event.webkitMovementY || 0;
2017-07-27 02:40:58 +00:00
}
this.justMoved = true;
2017-07-18 16:22:14 +00:00
this.dirty = true;
this.wasTouch = false;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#touchstart
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {TouchEvent} event - [description]
2018-03-18 13:43:37 +00:00
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
2018-01-26 12:43:34 +00:00
*/
touchstart: function (event, time)
{
if (event['pointerId'])
{
this.pointerId = event.pointerId;
}
this.identifier = event.identifier;
this.target = event.target;
this.active = true;
this.buttons = 1;
this.event = event;
this.x = this.manager.transformX(event.pageX);
this.y = this.manager.transformY(event.pageY);
this.primaryDown = true;
this.downX = this.x;
this.downY = this.y;
this.downTime = time;
this.justDown = true;
this.isDown = true;
this.dirty = true;
this.wasTouch = true;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#touchmove
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*
* @param {TouchEvent} event - [description]
2018-03-18 13:43:37 +00:00
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
2018-01-26 12:43:34 +00:00
*/
touchmove: function (event)
{
this.event = event;
this.x = this.manager.transformX(event.pageX);
this.y = this.manager.transformY(event.pageY);
this.justMoved = true;
2017-07-18 16:22:14 +00:00
this.dirty = true;
this.wasTouch = true;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#touchend
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {TouchEvent} event - [description]
2018-03-18 13:43:37 +00:00
* @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
2018-01-26 12:43:34 +00:00
*/
touchend: function (event, time)
{
this.buttons = 0;
this.event = event;
this.x = this.manager.transformX(event.pageX);
this.y = this.manager.transformY(event.pageY);
this.primaryDown = false;
this.upX = this.x;
this.upY = this.y;
this.upTime = time;
this.justUp = true;
this.isDown = false;
this.dirty = true;
this.wasTouch = true;
this.active = false;
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#noButtonDown
* @since 3.0.0
*
* @return {boolean} [description]
*/
noButtonDown: function ()
{
return (this.buttons === 0);
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#leftButtonDown
* @since 3.0.0
*
* @return {boolean} [description]
*/
leftButtonDown: function ()
{
return (this.buttons & 1);
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#rightButtonDown
* @since 3.0.0
*
* @return {boolean} [description]
*/
rightButtonDown: function ()
{
return (this.buttons & 2);
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#middleButtonDown
* @since 3.0.0
*
* @return {boolean} [description]
*/
middleButtonDown: function ()
{
return (this.buttons & 4);
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#backButtonDown
* @since 3.0.0
*
* @return {boolean} [description]
*/
backButtonDown: function ()
{
return (this.buttons & 8);
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Pointer#forwardButtonDown
* @since 3.0.0
*
* @return {boolean} [description]
*/
forwardButtonDown: function ()
{
return (this.buttons & 16);
},
/**
* [description]
*
* @method Phaser.Input.Pointer#destroy
* @since 3.0.0
*/
destroy: function ()
{
this.camera = null;
this.manager = null;
this.position = null;
},
/**
* [description]
*
* @name Phaser.Input.Pointer#x
* @type {number}
* @since 3.0.0
*/
x: {
get: function ()
{
return this.position.x;
},
set: function (value)
{
this.position.x = value;
}
},
/**
* [description]
*
* @name Phaser.Input.Pointer#y
* @type {number}
* @since 3.0.0
*/
y: {
get: function ()
{
return this.position.y;
},
set: function (value)
{
this.position.y = value;
}
}
});
module.exports = Pointer;