phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers.
280 lines (242 loc) • 7.51 kB
JavaScript
/**
* @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 GetFastValue = require('../../../utils/object/GetFastValue');
var ProcessKeyCombo = require('./ProcessKeyCombo');
var ResetKeyCombo = require('./ResetKeyCombo');
/**
* @callback KeyboardKeydownCallback
*
* @param {KeyboardEvent} event - [description]
*/
/**
* @typedef {object} KeyComboConfig
*
* @property {boolean} [resetOnWrongKey=true] - [description]
* @property {number} [maxKeyDelay=0] - [description]
* @property {boolean} [resetOnMatch=false] - [description]
* @property {boolean} [deleteOnMatch=false] - [description]
*/
/**
* @classdesc
* [description]
*
* `keys` argument can be:
*
* A string (ATARI)
* An array of either integers (key codes) or strings, or a mixture of both
* An array of objects (such as Key objects) with a public 'keyCode' property
*
* @class KeyCombo
* @memberOf Phaser.Input.Keyboard
* @constructor
* @since 3.0.0
*
* @param {Phaser.Input.Keyboard.KeyboardManager} keyboardManager - [description]
* @param {(string|integer[]|object[])} keys - [description]
* @param {KeyComboConfig} [config] - [description]
*/
var KeyCombo = new Class({
initialize:
function KeyCombo (keyboardManager, keys, config)
{
if (config === undefined) { config = {}; }
// Can't have a zero or single length combo (string or array based)
if (keys.length < 2)
{
return false;
}
/**
* [description]
*
* @name Phaser.Input.Keyboard.KeyCombo#manager
* @type {Phaser.Input.Keyboard.KeyboardManager}
* @since 3.0.0
*/
this.manager = keyboardManager;
/**
* [description]
*
* @name Phaser.Input.Keyboard.KeyCombo#enabled
* @type {boolean}
* @default true
* @since 3.0.0
*/
this.enabled = true;
/**
* [description]
*
* @name Phaser.Input.Keyboard.KeyCombo#keyCodes
* @type {array}
* @default []
* @since 3.0.0
*/
this.keyCodes = [];
// if 'keys' is a string we need to get the keycode of each character in it
for (var i = 0; i < keys.length; i++)
{
var char = keys[i];
if (typeof char === 'string')
{
this.keyCodes.push(char.toUpperCase().charCodeAt(0));
}
else if (typeof char === 'number')
{
this.keyCodes.push(char);
}
else if (char.hasOwnProperty('keyCode'))
{
this.keyCodes.push(char.keyCode);
}
}
/**
* The current keyCode the combo is waiting for.
*
* @name Phaser.Input.Keyboard.KeyCombo#current
* @type {integer}
* @since 3.0.0
*/
this.current = this.keyCodes[0];
/**
* The current index of the key being waited for in the 'keys' string.
*
* @name Phaser.Input.Keyboard.KeyCombo#index
* @type {number}
* @default 0
* @since 3.0.0
*/
this.index = 0;
/**
* The length of this combo (in keycodes)
*
* @name Phaser.Input.Keyboard.KeyCombo#size
* @type {number}
* @since 3.0.0
*/
this.size = this.keyCodes.length;
/**
* The time the previous key in the combo was matched.
*
* @name Phaser.Input.Keyboard.KeyCombo#timeLastMatched
* @type {number}
* @default 0
* @since 3.0.0
*/
this.timeLastMatched = 0;
/**
* Has this Key Combo been matched yet?
*
* @name Phaser.Input.Keyboard.KeyCombo#matched
* @type {boolean}
* @default false
* @since 3.0.0
*/
this.matched = false;
/**
* The time the entire combo was matched.
*
* @name Phaser.Input.Keyboard.KeyCombo#timeMatched
* @type {number}
* @default 0
* @since 3.0.0
*/
this.timeMatched = 0;
/**
* If they press the wrong key do we reset the combo?
*
* @name Phaser.Input.Keyboard.KeyCombo#resetOnWrongKey
* @type {boolean}
* @default 0
* @since 3.0.0
*/
this.resetOnWrongKey = GetFastValue(config, 'resetOnWrongKey', true);
/**
* The max delay in ms between each key press. Above this the combo is reset. 0 means disabled.
*
* @name Phaser.Input.Keyboard.KeyCombo#maxKeyDelay
* @type {integer}
* @default 0
* @since 3.0.0
*/
this.maxKeyDelay = GetFastValue(config, 'maxKeyDelay', 0);
/**
* If previously matched and they press Key 1 again, will it reset?
*
* @name Phaser.Input.Keyboard.KeyCombo#resetOnMatch
* @type {boolean}
* @default false
* @since 3.0.0
*/
this.resetOnMatch = GetFastValue(config, 'resetOnMatch', false);
/**
* If the combo matches, will it delete itself?
*
* @name Phaser.Input.Keyboard.KeyCombo#deleteOnMatch
* @type {boolean}
* @default false
* @since 3.0.0
*/
this.deleteOnMatch = GetFastValue(config, 'deleteOnMatch', false);
var _this = this;
var onKeyDownHandler = function (event)
{
if (_this.matched || !_this.enabled)
{
return;
}
var matched = ProcessKeyCombo(event, _this);
if (matched)
{
_this.manager.emit('keycombomatch', _this, event);
if (_this.resetOnMatch)
{
ResetKeyCombo(_this);
}
else if (_this.deleteOnMatch)
{
_this.destroy();
}
}
};
/**
* [description]
*
* @name Phaser.Input.Keyboard.KeyCombo#onKeyDown
* @type {KeyboardKeydownCallback}
* @since 3.0.0
*/
this.onKeyDown = onKeyDownHandler;
this.manager.on('keydown', onKeyDownHandler);
},
/**
* How far complete is this combo? A value between 0 and 1.
*
* @name Phaser.Input.Keyboard.KeyCombo#progress
* @type {number}
* @readOnly
* @since 3.0.0
*/
progress: {
get: function ()
{
return this.index / this.size;
}
},
/**
* [description]
*
* @method Phaser.Input.Keyboard.KeyCombo#destroy
* @since 3.0.0
*/
destroy: function ()
{
this.enabled = false;
this.keyCodes = [];
this.manager.off('keydown', this.onKeyDown);
this.manager = undefined;
}
});
module.exports = KeyCombo;