2013-10-02 13:18:58 +01:00
|
|
|
/**
|
|
|
|
* @author Richard Davey <rich@photonstorm.com>
|
2014-02-05 05:54:25 +00:00
|
|
|
* @copyright 2014 Photon Storm Ltd.
|
2013-10-02 13:18:58 +01:00
|
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2014-09-16 17:35:08 +01:00
|
|
|
* If you need more fine-grained control over the handling of specific keys you can create and use Phaser.Key objects.
|
|
|
|
*
|
2013-10-02 13:18:58 +01:00
|
|
|
* @class Phaser.Key
|
|
|
|
* @constructor
|
|
|
|
* @param {Phaser.Game} game - Current game instance.
|
|
|
|
* @param {number} keycode - The key code this Key is responsible for.
|
|
|
|
*/
|
2013-10-01 01:18:29 +01:00
|
|
|
Phaser.Key = function (game, keycode) {
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
2014-03-23 00:59:28 -07:00
|
|
|
* @property {Phaser.Game} game - A reference to the currently running game.
|
2013-11-25 03:13:04 +00:00
|
|
|
*/
|
|
|
|
this.game = game;
|
|
|
|
|
2014-04-09 02:29:41 +01:00
|
|
|
/**
|
2014-10-28 22:45:30 -07:00
|
|
|
* The enabled state of the key - see `enabled`.
|
|
|
|
* @property {boolean} _enabled
|
2014-10-28 22:47:44 -07:00
|
|
|
* @private
|
2014-04-09 02:29:41 +01:00
|
|
|
*/
|
2014-10-28 22:45:30 -07:00
|
|
|
this._enabled = true;
|
2014-04-09 02:29:41 +01:00
|
|
|
|
2014-03-13 16:49:52 +00:00
|
|
|
/**
|
|
|
|
* @property {object} event - Stores the most recent DOM event.
|
|
|
|
* @readonly
|
|
|
|
*/
|
|
|
|
this.event = null;
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
|
|
|
* @property {boolean} isDown - The "down" state of the key.
|
|
|
|
* @default
|
|
|
|
*/
|
|
|
|
this.isDown = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {boolean} isUp - The "up" state of the key.
|
|
|
|
* @default
|
|
|
|
*/
|
2014-02-24 00:18:12 +00:00
|
|
|
this.isUp = true;
|
2013-11-25 03:13:04 +00:00
|
|
|
|
2014-11-13 18:34:36 +13:00
|
|
|
/**
|
|
|
|
* @property {boolean} _justDown - True if the key has just been pressed (NOTE: requires to be reset, see justDown getter)
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
this._justDown = false;
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
|
|
|
* @property {boolean} altKey - The down state of the ALT key, if pressed at the same time as this key.
|
|
|
|
* @default
|
|
|
|
*/
|
|
|
|
this.altKey = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {boolean} ctrlKey - The down state of the CTRL key, if pressed at the same time as this key.
|
|
|
|
* @default
|
|
|
|
*/
|
|
|
|
this.ctrlKey = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {boolean} shiftKey - The down state of the SHIFT key, if pressed at the same time as this key.
|
|
|
|
* @default
|
|
|
|
*/
|
|
|
|
this.shiftKey = false;
|
|
|
|
|
|
|
|
/**
|
2014-02-24 15:58:02 +00:00
|
|
|
* @property {number} timeDown - The timestamp when the key was last pressed down. This is based on Game.time.now.
|
2013-11-25 03:13:04 +00:00
|
|
|
*/
|
|
|
|
this.timeDown = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* If the key is down this value holds the duration of that key press and is constantly updated.
|
|
|
|
* If the key is up it holds the duration of the previous down session.
|
|
|
|
* @property {number} duration - The number of milliseconds this key has been held down for.
|
|
|
|
* @default
|
|
|
|
*/
|
|
|
|
this.duration = 0;
|
|
|
|
|
|
|
|
/**
|
2014-02-24 15:58:02 +00:00
|
|
|
* @property {number} timeUp - The timestamp when the key was last released. This is based on Game.time.now.
|
2013-11-25 03:13:04 +00:00
|
|
|
* @default
|
|
|
|
*/
|
2014-02-24 15:58:02 +00:00
|
|
|
this.timeUp = -2500;
|
2013-11-25 03:13:04 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {number} repeats - If a key is held down this holds down the number of times the key has 'repeated'.
|
|
|
|
* @default
|
|
|
|
*/
|
|
|
|
this.repeats = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {number} keyCode - The keycode of this key.
|
|
|
|
*/
|
|
|
|
this.keyCode = keycode;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {Phaser.Signal} onDown - This Signal is dispatched every time this Key is pressed down. It is only dispatched once (until the key is released again).
|
|
|
|
*/
|
2013-10-01 01:18:29 +01:00
|
|
|
this.onDown = new Phaser.Signal();
|
2013-10-02 13:18:58 +01:00
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
/**
|
|
|
|
* @property {function} onHoldCallback - A callback that is called while this Key is held down. Warning: Depending on refresh rate that could be 60+ times per second.
|
|
|
|
*/
|
|
|
|
this.onHoldCallback = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {object} onHoldContext - The context under which the onHoldCallback will be called.
|
|
|
|
*/
|
|
|
|
this.onHoldContext = null;
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
|
|
|
* @property {Phaser.Signal} onUp - This Signal is dispatched every time this Key is pressed down. It is only dispatched once (until the key is released again).
|
|
|
|
*/
|
2013-10-01 01:18:29 +01:00
|
|
|
this.onUp = new Phaser.Signal();
|
2014-03-23 00:59:28 -07:00
|
|
|
|
2013-10-01 01:18:29 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
Phaser.Key.prototype = {
|
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
update: function () {
|
|
|
|
|
2014-10-28 22:45:30 -07:00
|
|
|
if (!this._enabled) { return; }
|
2014-04-09 02:29:41 +01:00
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
if (this.isDown)
|
|
|
|
{
|
2014-11-08 20:01:10 +00:00
|
|
|
this.duration = this.game.time.time - this.timeDown;
|
2014-02-24 15:58:02 +00:00
|
|
|
this.repeats++;
|
|
|
|
|
|
|
|
if (this.onHoldCallback)
|
|
|
|
{
|
|
|
|
this.onHoldCallback.call(this.onHoldContext, this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
2013-10-02 13:18:58 +01:00
|
|
|
* Called automatically by Phaser.Keyboard.
|
|
|
|
* @method Phaser.Key#processKeyDown
|
2013-10-01 01:18:29 +01:00
|
|
|
* @param {KeyboardEvent} event.
|
2013-10-02 13:18:58 +01:00
|
|
|
* @protected
|
2013-10-01 01:18:29 +01:00
|
|
|
*/
|
|
|
|
processKeyDown: function (event) {
|
|
|
|
|
2014-10-28 22:45:30 -07:00
|
|
|
if (!this._enabled) { return; }
|
2014-04-09 02:29:41 +01:00
|
|
|
|
2014-03-13 16:49:52 +00:00
|
|
|
this.event = event;
|
|
|
|
|
2014-11-13 18:34:36 +13:00
|
|
|
// exit if this key down is from auto-repeat
|
2014-02-24 15:58:02 +00:00
|
|
|
if (this.isDown)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-10-01 01:18:29 +01:00
|
|
|
this.altKey = event.altKey;
|
|
|
|
this.ctrlKey = event.ctrlKey;
|
|
|
|
this.shiftKey = event.shiftKey;
|
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
this.isDown = true;
|
|
|
|
this.isUp = false;
|
2014-11-08 20:01:10 +00:00
|
|
|
this.timeDown = this.game.time.time;
|
2014-02-24 15:58:02 +00:00
|
|
|
this.duration = 0;
|
|
|
|
this.repeats = 0;
|
2013-10-01 01:18:29 +01:00
|
|
|
|
2014-11-13 18:34:36 +13:00
|
|
|
// _justDown will remain true until it is read via the justDown Getter
|
|
|
|
// this enables the game to poll for past presses, or reset it at the start of a new game state
|
|
|
|
this._justDown = true;
|
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
this.onDown.dispatch(this);
|
2013-10-01 01:18:29 +01:00
|
|
|
|
|
|
|
},
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
2013-10-02 13:18:58 +01:00
|
|
|
* Called automatically by Phaser.Keyboard.
|
|
|
|
* @method Phaser.Key#processKeyUp
|
|
|
|
* @param {KeyboardEvent} event.
|
|
|
|
* @protected
|
|
|
|
*/
|
2013-10-01 01:18:29 +01:00
|
|
|
processKeyUp: function (event) {
|
|
|
|
|
2014-10-28 22:45:30 -07:00
|
|
|
if (!this._enabled) { return; }
|
2014-04-09 02:29:41 +01:00
|
|
|
|
2014-03-13 16:49:52 +00:00
|
|
|
this.event = event;
|
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
if (this.isUp)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-10-01 01:18:29 +01:00
|
|
|
this.isDown = false;
|
|
|
|
this.isUp = true;
|
2014-11-08 20:01:10 +00:00
|
|
|
this.timeUp = this.game.time.time;
|
|
|
|
this.duration = this.game.time.time - this.timeDown;
|
2013-10-01 01:18:29 +01:00
|
|
|
|
|
|
|
this.onUp.dispatch(this);
|
|
|
|
|
|
|
|
},
|
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
/**
|
2014-10-28 22:45:30 -07:00
|
|
|
* Resets the state of this Key.
|
|
|
|
*
|
|
|
|
* This sets isDown to false, isUp to true, resets the time to be the current time, and _enables_ the key.
|
|
|
|
* In addition, if it is a "hard reset", it clears clears any callbacks associated with the onDown and onUp events and removes the onHoldCallback.
|
2014-02-24 15:58:02 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Key#reset
|
2014-10-28 22:45:30 -07:00
|
|
|
* @param {boolean} [hard=true] - A soft reset won't reset any events or callbacks; a hard reset will.
|
2014-02-24 15:58:02 +00:00
|
|
|
*/
|
2014-04-14 21:53:08 +01:00
|
|
|
reset: function (hard) {
|
|
|
|
|
|
|
|
if (typeof hard === 'undefined') { hard = true; }
|
2014-02-24 15:58:02 +00:00
|
|
|
|
|
|
|
this.isDown = false;
|
|
|
|
this.isUp = true;
|
2014-11-08 20:01:10 +00:00
|
|
|
this.timeUp = this.game.time.time;
|
2014-07-01 16:57:55 +01:00
|
|
|
this.duration = 0;
|
2014-10-28 22:45:30 -07:00
|
|
|
this._enabled = true; // .enabled causes reset(false)
|
2014-02-24 15:58:02 +00:00
|
|
|
|
2014-04-14 21:53:08 +01:00
|
|
|
if (hard)
|
|
|
|
{
|
|
|
|
this.onDown.removeAll();
|
|
|
|
this.onUp.removeAll();
|
|
|
|
this.onHoldCallback = null;
|
|
|
|
this.onHoldContext = null;
|
|
|
|
}
|
2014-04-01 04:41:43 +01:00
|
|
|
|
2014-02-24 15:58:02 +00:00
|
|
|
},
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
2014-08-31 19:05:31 +01:00
|
|
|
* Returns the "just pressed" state of the Key. Just pressed is considered true if the key was pressed down within the duration given.
|
2013-10-02 13:18:58 +01:00
|
|
|
* @method Phaser.Key#justPressed
|
2014-05-14 00:22:08 +01:00
|
|
|
* @param {number} [duration=50] - The duration below which the key is considered as being just pressed.
|
2013-10-02 13:18:58 +01:00
|
|
|
* @return {boolean} True if the key is just pressed otherwise false.
|
2013-10-01 01:18:29 +01:00
|
|
|
*/
|
|
|
|
justPressed: function (duration) {
|
|
|
|
|
2014-05-14 00:22:08 +01:00
|
|
|
if (typeof duration === "undefined") { duration = 50; }
|
2013-10-01 01:18:29 +01:00
|
|
|
|
|
|
|
return (this.isDown && this.duration < duration);
|
|
|
|
|
|
|
|
},
|
|
|
|
|
2013-11-25 03:13:04 +00:00
|
|
|
/**
|
2014-08-31 19:05:31 +01:00
|
|
|
* Returns the "just released" state of the Key. Just released is considered as being true if the key was released within the duration given.
|
2014-02-19 03:51:48 +00:00
|
|
|
* @method Phaser.Key#justReleased
|
2014-05-14 00:22:08 +01:00
|
|
|
* @param {number} [duration=50] - The duration below which the key is considered as being just released.
|
2013-10-02 13:18:58 +01:00
|
|
|
* @return {boolean} True if the key is just released otherwise false.
|
2013-10-01 01:18:29 +01:00
|
|
|
*/
|
|
|
|
justReleased: function (duration) {
|
|
|
|
|
2014-05-14 00:22:08 +01:00
|
|
|
if (typeof duration === "undefined") { duration = 50; }
|
2013-10-01 01:18:29 +01:00
|
|
|
|
2014-11-08 20:01:10 +00:00
|
|
|
return (!this.isDown && ((this.game.time.time - this.timeUp) < duration));
|
2013-10-01 01:18:29 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-10-02 13:18:58 +01:00
|
|
|
};
|
2013-12-30 16:54:00 +00:00
|
|
|
|
2014-11-13 18:34:36 +13:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Getter / Setter for _justDown property.
|
|
|
|
* Reading justDown will reset it to false
|
|
|
|
* @property {boolean} justDown
|
|
|
|
* @memberof Phaser.Key
|
|
|
|
* @default false
|
|
|
|
*/
|
|
|
|
Object.defineProperty(Phaser.Key.prototype, "justDown", {
|
|
|
|
|
|
|
|
get: function () {
|
|
|
|
var r = this._justDown;
|
|
|
|
this._justDown = false;
|
|
|
|
return r;
|
|
|
|
},
|
|
|
|
set: function (value) {
|
|
|
|
this._justDown = value;
|
|
|
|
},
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
2014-10-28 22:45:30 -07:00
|
|
|
/**
|
|
|
|
* An enabled key processes its update and dispatches events.
|
|
|
|
* A key can be disabled momentarily at runtime instead of deleting it.
|
|
|
|
* @property {boolean} enabled
|
|
|
|
* @memberof Phaser.Key
|
|
|
|
* @default true
|
|
|
|
*/
|
|
|
|
Object.defineProperty(Phaser.Key.prototype, "enabled", {
|
|
|
|
|
|
|
|
get: function () {
|
|
|
|
return this._enabled;
|
|
|
|
},
|
|
|
|
set: function (value) {
|
|
|
|
value = !!value;
|
|
|
|
|
|
|
|
if (value !== this._enabled)
|
|
|
|
{
|
|
|
|
if (!value)
|
|
|
|
{
|
|
|
|
this.reset(false);
|
|
|
|
}
|
|
|
|
this._enabled = value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2013-12-30 16:54:00 +00:00
|
|
|
Phaser.Key.prototype.constructor = Phaser.Key;
|