From 3b87ce9fc9764d3125e159d9bcf0ecd206f6a0b3 Mon Sep 17 00:00:00 2001 From: photonstorm Date: Tue, 31 Dec 2013 01:45:30 +0000 Subject: [PATCH] Brand new Gamepad API support fully implemented (thanks to Karl Macklin), with examples to show use. --- Gruntfile.js | 3 + README.md | 2 + examples/_site/examples.json | 60 +++-- examples/_site/view_lite.html | 3 + src/input/Gamepad.js | 349 +++++++++++++++------------ src/input/GamepadButton.js | 159 ++++++------ src/input/SinglePad.js | 442 +++++++++++++++++++--------------- 7 files changed, 562 insertions(+), 456 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index d44632b2..6349f03f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -69,6 +69,9 @@ module.exports = function (grunt) { 'src/input/Pointer.js', 'src/input/Touch.js', 'src/input/InputHandler.js', + 'src/input/Gamepad.js', + 'src/input/SinglePad.js', + 'src/input/GamepadButton.js', 'src/gameobjects/Events.js', 'src/gameobjects/GameObjectFactory.js', 'src/gameobjects/BitmapData.js', diff --git a/README.md b/README.md index 973a8f73..c75db05c 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ Significant API changes: New features: +* Gamepad API support has been added with lots of new examples showing how to use it (thanks Karl Macklin) * Phaser.Game constructor can now be passed a single object containing game settings + Stage settings, useful for advanced configurations. * The width/height given to Phaser.Game can now be percentages, i.e. "100%" will set the width to the maximum window innerWidth. * Added a stage.fullScreenScaleMode property to determine scaling when fullscreen (thanks oysterCrusher) @@ -81,6 +82,7 @@ New Examples: * Games - Matching Pairs by Patrick OReilly. * Tweens - Example showing how to use the tween events, onStart, onLoop and onComplete. * Display - Pixi Render Texture. A Phaser conversion of the Pixi.js Render Texture example. +* Input - 5 new examples showing how to use the Gamepad API (thanks Karl Macklin) Updates: diff --git a/examples/_site/examples.json b/examples/_site/examples.json index 25b2402d..2036beff 100644 --- a/examples/_site/examples.json +++ b/examples/_site/examples.json @@ -147,6 +147,32 @@ "title": "vertical collision" } ], + "debug": [ + { + "file": "debug+camera.js", + "title": "debug camera" + }, + { + "file": "debug+display.js", + "title": "debug display" + }, + { + "file": "debug+draw.js", + "title": "debug draw" + }, + { + "file": "debug+input.js", + "title": "debug input" + }, + { + "file": "debug+physics.js", + "title": "debug physics" + }, + { + "file": "debug+sprite.js", + "title": "debug sprite" + } + ], "display": [ { "file": "bitmapdata+wobble.js", @@ -181,28 +207,6 @@ "title": "render texture trail" } ], - "debug":[ - { - "file": "debug+sprite.js", - "title": "Sprite data" - }, - { - "file": "debug+display.js", - "title": "Sprite display" - }, - { - "file": "debug+input.js", - "title": "Input" - }, - { - "file": "debug+camera.js", - "title": "Camera" - }, - { - "file": "debug+draw.js", - "title": "Draw" - } - ], "filters": [ { "file": "blur.js", @@ -282,10 +286,6 @@ "file": "add+a+sprite+to+group.js", "title": "add a sprite to group" }, - { - "file": "bring+a+child+to+top.js", - "title": "bring a child to top" - }, { "file": "bring+a+group+to+top.js", "title": "bring a group to top" @@ -364,6 +364,10 @@ } ], "input": [ + { + "file": "bring+a+child+to+top.js", + "title": "bring a child to top" + }, { "file": "cursor+key+movement.js", "title": "cursor key movement" @@ -798,6 +802,10 @@ "file": "tween+loop+event.js", "title": "tween loop event" }, + { + "file": "tween+relative.js", + "title": "tween relative" + }, { "file": "tween+several+properties.js", "title": "tween several properties" diff --git a/examples/_site/view_lite.html b/examples/_site/view_lite.html index 2f7dca3c..e43cd752 100644 --- a/examples/_site/view_lite.html +++ b/examples/_site/view_lite.html @@ -81,6 +81,9 @@ + + + diff --git a/src/input/Gamepad.js b/src/input/Gamepad.js index 2295b2f4..2d20c9f6 100644 --- a/src/input/Gamepad.js +++ b/src/input/Gamepad.js @@ -26,32 +26,33 @@ Phaser.Gamepad = function (game) { this.game = game; /** - * @property {Array} _gamepads - The four Phaser Gamepads. - * @private - */ + * @property {Array} _gamepads - The four Phaser Gamepads. + * @private + */ this._gamepads = [ - new Phaser.SinglePad(game,this), - new Phaser.SinglePad(game,this), - new Phaser.SinglePad(game,this), - new Phaser.SinglePad(game,this) + new Phaser.SinglePad(game, this), + new Phaser.SinglePad(game, this), + new Phaser.SinglePad(game, this), + new Phaser.SinglePad(game, this) ]; /** - * @property {Object} _gamepadIndexMap - Maps the browsers gamepad indices to our Phaser Gamepads - * @private - */ + * @property {Object} _gamepadIndexMap - Maps the browsers gamepad indices to our Phaser Gamepads + * @private + */ this._gamepadIndexMap = {}; /** - * @property {Array} _rawPads - The raw state of the gamepads from the browser - * @private - */ + * @property {Array} _rawPads - The raw state of the gamepads from the browser + * @private + */ this._rawPads = []; /** - * @property {boolean} _active - Private flag for whether or not the API is polled - * @private - */ + * @property {boolean} _active - Private flag for whether or not the API is polled + * @private + * @default + */ this._active = false; /** @@ -62,28 +63,26 @@ Phaser.Gamepad = function (game) { this.disabled = false; /** - * Whether or not gamepads are supported* in current browser. * = This check is actually not accurate at all due to poor implementation. - * @property {boolean} _gamepadSupportAvailable - Gamepad supported in this browser or not. - * @private - * @default - */ + * Whether or not gamepads are supported in the current browser. Note that as of Dec. 2013 this check is actually not accurate at all due to poor implementation. + * @property {boolean} _gamepadSupportAvailable - Are gamepads supported in this browser or not? + * @private + */ this._gamepadSupportAvailable = !!navigator.webkitGetGamepads || !!navigator.webkitGamepads || (navigator.userAgent.indexOf('Firefox/') != -1); - /** - * Used to check for differences between earlier polls and current state of gamepads. - * @property {Array} _prevRawGamepadTypes - * @private - * @default - */ + * Used to check for differences between earlier polls and current state of gamepads. + * @property {Array} _prevRawGamepadTypes + * @private + * @default + */ this._prevRawGamepadTypes = []; /** - * Used to check for differences between earlier polls and current state of gamepads. - * @property {Array} _prevTimestamps - * @private - * @default - */ + * Used to check for differences between earlier polls and current state of gamepads. + * @property {Array} _prevTimestamps + * @private + * @default + */ this._prevTimestamps = []; /** @@ -92,46 +91,45 @@ Phaser.Gamepad = function (game) { this.callbackContext = this; /** - * @property {function} onConnectCallback - This callback is invoked every time any gamepad is connected - */ + * @property {function} onConnectCallback - This callback is invoked every time any gamepad is connected + */ this.onConnectCallback = null; /** - * @property {function} onDisconnectCallback - This callback is invoked every time any gamepad is disconnected - */ + * @property {function} onDisconnectCallback - This callback is invoked every time any gamepad is disconnected + */ this.onDisconnectCallback = null; /** - * @property {function} onDownCallback - This callback is invoked every time any gamepad button is pressed down. - */ + * @property {function} onDownCallback - This callback is invoked every time any gamepad button is pressed down. + */ this.onDownCallback = null; /** - * @property {function} onUpCallback - This callback is invoked every time any gamepad button is released. - */ + * @property {function} onUpCallback - This callback is invoked every time any gamepad button is released. + */ this.onUpCallback = null; /** - * @property {function} onAxisCallback - This callback is invoked every time any gamepad axis is changed. - */ + * @property {function} onAxisCallback - This callback is invoked every time any gamepad axis is changed. + */ this.onAxisCallback = null; /** - * @property {function} onFloatCallback - This callback is invoked every time any gamepad button is changed to a value where value > 0 and value < 1. - */ + * @property {function} onFloatCallback - This callback is invoked every time any gamepad button is changed to a value where value > 0 and value < 1. + */ this.onFloatCallback = null; - /** - * @property {function} _ongamepadconnected - Private callback for Firefox gamepad connection handling - * @private - */ + * @property {function} _ongamepadconnected - Private callback for Firefox gamepad connection handling + * @private + */ this._ongamepadconnected = null; /** - * @property {function} _gamepaddisconnected - Private callback for Firefox gamepad connection handling - * @private - */ + * @property {function} _gamepaddisconnected - Private callback for Firefox gamepad connection handling + * @private + */ this._gamepaddisconnected = null; }; @@ -141,12 +139,13 @@ Phaser.Gamepad.prototype = { * Add callbacks to the main Gamepad handler to handle connect/disconnect/button down/button up/axis change/float value buttons * @method Phaser.Gamepad#addCallbacks * @param {Object} context - The context under which the callbacks are run. - * @param {Object} callbacks - Object that takes six different callbak methods: + * @param {Object} callbacks - Object that takes six different callback methods: * onConnectCallback, onDisconnectCallback, onDownCallback, onUpCallback, onAxisCallback, onFloatCallback */ addCallbacks: function (context, callbacks) { - if (typeof callbacks !== 'undefined') { + if (typeof callbacks !== 'undefined') + { this.onConnectCallback = (typeof callbacks.onConnect === 'function') ? callbacks.onConnect : this.onConnectCallback; this.onDisconnectCallback = (typeof callbacks.onDisconnect === 'function') ? callbacks.onDisconnect : this.onDisconnectCallback; this.onDownCallback = (typeof callbacks.onDown === 'function') ? callbacks.onDown : this.onDownCallback; @@ -154,22 +153,9 @@ Phaser.Gamepad.prototype = { this.onAxisCallback = (typeof callbacks.onAxis === 'function') ? callbacks.onAxis : this.onAxisCallback; this.onFloatCallback = (typeof callbacks.onFloat === 'function') ? callbacks.onFloat : this.onFloatCallback; } + }, - -// /** -// * Removes a Button object from the Gamepad manager. -// * -// * @method Phaser.Gamepad#removeKey -// * @param {number} buttoncode - The buttoncode of the button to remove, i.e. Phaser.Gamepad.0 or Phaser.Gamepad.1 -// */ -// removeButton: function (buttoncode) { -// -// delete (this._hotbuttons[buttoncode]); -// -// }, - - /** * Starts the Gamepad event handling. * This MUST be called manually before Phaser will start polling the Gamepad API. @@ -186,73 +172,97 @@ Phaser.Gamepad.prototype = { _this._rawPads.push(newPad); _this._gamepads[newPad.index].connect(newPad); }; + window.addEventListener('gamepadconnected', this._ongamepadconnected, false); this._ongamepaddisconnected = function(event) { + var removedPad = event.gamepad; - for (var i in _this._rawPads) { - if(_this._rawPads[i].index === removedPad.index) { + + for (var i in _this._rawPads) + { + if (_this._rawPads[i].index === removedPad.index) + { _this._rawPads.splice(i,1); } } _this._gamepads[removedPad.index].disconnect(); }; + window.addEventListener('gamepaddisconnected', this._ongamepaddisconnected, false); }, /** - * Main gamepad update loop. Should not be called manually. - * @method Phaser.Gamepad#update - */ + * Main gamepad update loop. Should not be called manually. + * @method Phaser.Gamepad#update + * @private + */ update: function () { this._pollGamepads(); - for (var i = 0; i < this._gamepads.length; i += 1) { - if(this._gamepads[i]._connected) { + + for (var i = 0; i < this._gamepads.length; i++) + { + if (this._gamepads[i]._connected) + { this._gamepads[i].pollStatus(); } } + }, /** - * Updating connected gamepads (for Google Chrome). - * Should not be called manually. - * @method Phaser.Gamepad#_pollGamepads - */ + * Updating connected gamepads (for Google Chrome). + * Should not be called manually. + * @method Phaser.Gamepad#_pollGamepads + * @private + */ _pollGamepads: function () { var rawGamepads = (navigator.webkitGetGamepads && navigator.webkitGetGamepads()) || navigator.webkitGamepads; - if(rawGamepads) { + if (rawGamepads) + { this._rawPads = []; var gamepadsChanged = false; - for (var i = 0; i < rawGamepads.length; i += 1) { - if (typeof rawGamepads[i] !== this._prevRawGamepadTypes[i]) { + for (var i = 0; i < rawGamepads.length; i++) + { + if (typeof rawGamepads[i] !== this._prevRawGamepadTypes[i]) + { gamepadsChanged = true; this._prevRawGamepadTypes[i] = typeof rawGamepads[i]; } - if (rawGamepads[i]) { + + if (rawGamepads[i]) + { this._rawPads.push(rawGamepads[i]); } + // Support max 4 pads at the moment - if(i === 3) { + if (i === 3) + { break; } } - if(gamepadsChanged) { - - var validConnections = {rawIndices:{},padIndices:{}}; + if (gamepadsChanged) + { + var validConnections = { rawIndices: {}, padIndices: {} }; var singlePad; - for (var j = 0; j < this._gamepads.length; j += 1) { + for (var j = 0; j < this._gamepads.length; j++) + { singlePad = this._gamepads[j]; - if(singlePad.connected) { - for(var k = 0; k < this._rawPads.length; k += 1) { - if(this._rawPads[k].index === singlePad.index) { + + if (singlePad.connected) + { + for (var k = 0; k < this._rawPads.length; k++) + { + if (this._rawPads[k].index === singlePad.index) + { validConnections.rawIndices[singlePad.index] = true; validConnections.padIndices[j] = true; } @@ -260,32 +270,45 @@ Phaser.Gamepad.prototype = { } } - for (var l = 0; l < this._gamepads.length; l += 1) { + for (var l = 0; l < this._gamepads.length; l++) + { singlePad = this._gamepads[l]; - if(validConnections.padIndices[l]) { + if (validConnections.padIndices[l]) + { continue; } - if(this._rawPads.length < 1) { + if (this._rawPads.length < 1) + { singlePad.disconnect(); } - for (var m = 0; m < this._rawPads.length; m +=1) { - if(validConnections.padIndices[l]) { + for (var m = 0; m < this._rawPads.length; m++) + { + if (validConnections.padIndices[l]) + { break; } + var rawPad = this._rawPads[m]; - if (rawPad) { - if(validConnections.rawIndices[rawPad.index]) { + + if (rawPad) + { + if (validConnections.rawIndices[rawPad.index]) + { singlePad.disconnect(); continue; - } else { + } + else + { singlePad.connect(rawPad); validConnections.rawIndices[rawPad.index] = true; validConnections.padIndices[l] = true; } - } else { + } + else + { singlePad.disconnect(); } } @@ -295,13 +318,16 @@ Phaser.Gamepad.prototype = { }, /** - * Sets the deadZone variable for all four gamepads - * @method Phaser.Gamepad#setDeadZones - */ + * Sets the deadZone variable for all four gamepads + * @method Phaser.Gamepad#setDeadZones + */ setDeadZones: function (value) { - for(var i = 0; i < this._gamepads.length; i += 1) { + + for (var i = 0; i < this._gamepads.length; i++) + { this._gamepads[i].deadZone = value; } + }, /** @@ -312,23 +338,25 @@ Phaser.Gamepad.prototype = { stop: function () { this._active = false; - var _this = this; window.removeEventListener('gamepadconnected', this._ongamepadconnected); window.removeEventListener('gamepaddisconnected', this._ongamepaddisconnected); }, - /** * Reset all buttons/axes of all gamepads * @method Phaser.Gamepad#reset */ reset: function () { + this.update(); - for(var i = 0; i < this._gamepads.length; i += 1) { + + for (var i = 0; i < this._gamepads.length; i++) + { this._gamepads[i].reset(); } + }, /** @@ -340,12 +368,14 @@ Phaser.Gamepad.prototype = { */ justPressed: function (buttonCode, duration) { - for(var i = 0; i < this._gamepads.length; i += 1) { - - if( this._gamepads[i].justPressed(buttonCode, duration) == true ) { + for (var i = 0; i < this._gamepads.length; i++) + { + if (this._gamepads[i].justPressed(buttonCode, duration) === true) + { return true; } } + return false; }, @@ -359,41 +389,47 @@ Phaser.Gamepad.prototype = { */ justReleased: function (buttonCode, duration) { - for(var i = 0; i < this._gamepads.length; i += 1) { - - if( this._gamepads[i].justReleased(buttonCode, duration) == true ) { + for (var i = 0; i < this._gamepads.length; i++) + { + if (this._gamepads[i].justReleased(buttonCode, duration) === true) + { return true; } } + return false; }, /** - * Returns true if the button is currently pressed down, on ANY gamepad. - * @method Phaser.Gamepad#isDown - * @param {number} buttonCode - The buttonCode of the button to check for. - * @return {boolean} True if a button is currently down. - */ + * Returns true if the button is currently pressed down, on ANY gamepad. + * @method Phaser.Gamepad#isDown + * @param {number} buttonCode - The buttonCode of the button to check for. + * @return {boolean} True if a button is currently down. + */ isDown: function (buttonCode) { - for(var i = 0; i < this._gamepads.length; i += 1) { - - if( this._gamepads[i].isDown(buttonCode) == true ) { + for (var i = 0; i < this._gamepads.length; i++) + { + if (this._gamepads[i].isDown(buttonCode) === true) + { return true; } } + return false; } }; +Phaser.Gamepad.prototype.constructor = Phaser.Gamepad; + /** - * If the gamepad input is active or not - if not active it should not be updated from Input.js - * @name Phaser.Gamepad#active - * @property {boolean} active - If the gamepad input is active or not. - * @readonly - */ +* If the gamepad input is active or not - if not active it should not be updated from Input.js +* @name Phaser.Gamepad#active +* @property {boolean} active - If the gamepad input is active or not. +* @readonly +*/ Object.defineProperty(Phaser.Gamepad.prototype, "active", { get: function () { @@ -403,11 +439,11 @@ Object.defineProperty(Phaser.Gamepad.prototype, "active", { }); /** - * Whether or not gamepads are supported in current browser. - * @name Phaser.Gamepad#supported - * @property {boolean} supported - Whether or not gamepads are supported in current browser. - * @readonly - */ +* Whether or not gamepads are supported in current browser. +* @name Phaser.Gamepad#supported +* @property {boolean} supported - Whether or not gamepads are supported in current browser. +* @readonly +*/ Object.defineProperty(Phaser.Gamepad.prototype, "supported", { get: function () { @@ -417,11 +453,11 @@ Object.defineProperty(Phaser.Gamepad.prototype, "supported", { }); /** - * How many live gamepads are currently connected. - * @name Phaser.Gamepad#padsConnected - * @property {boolean} padsConnected - How many live gamepads are currently connected. - * @readonly - */ +* How many live gamepads are currently connected. +* @name Phaser.Gamepad#padsConnected +* @property {boolean} padsConnected - How many live gamepads are currently connected. +* @readonly +*/ Object.defineProperty(Phaser.Gamepad.prototype, "padsConnected", { get: function () { @@ -431,11 +467,11 @@ Object.defineProperty(Phaser.Gamepad.prototype, "padsConnected", { }); /** - * Gamepad #1 - * @name Phaser.Gamepad#pad1 - * @property {boolean} pad1 - Gamepad #1; - * @readonly - */ +* Gamepad #1 +* @name Phaser.Gamepad#pad1 +* @property {boolean} pad1 - Gamepad #1; +* @readonly +*/ Object.defineProperty(Phaser.Gamepad.prototype, "pad1", { get: function () { @@ -445,11 +481,11 @@ Object.defineProperty(Phaser.Gamepad.prototype, "pad1", { }); /** - * Gamepad #2 - * @name Phaser.Gamepad#pad2 - * @property {boolean} pad2 - Gamepad #2 - * @readonly - */ +* Gamepad #2 +* @name Phaser.Gamepad#pad2 +* @property {boolean} pad2 - Gamepad #2 +* @readonly +*/ Object.defineProperty(Phaser.Gamepad.prototype, "pad2", { get: function () { @@ -459,11 +495,11 @@ Object.defineProperty(Phaser.Gamepad.prototype, "pad2", { }); /** - * Gamepad #3 - * @name Phaser.Gamepad#pad3 - * @property {boolean} pad3 - Gamepad #3 - * @readonly - */ +* Gamepad #3 +* @name Phaser.Gamepad#pad3 +* @property {boolean} pad3 - Gamepad #3 +* @readonly +*/ Object.defineProperty(Phaser.Gamepad.prototype, "pad3", { get: function () { @@ -473,11 +509,11 @@ Object.defineProperty(Phaser.Gamepad.prototype, "pad3", { }); /** - * Gamepad #4 - * @name Phaser.Gamepad#pad4 - * @property {boolean} pad4 - Gamepad #4 - * @readonly - */ +* Gamepad #4 +* @name Phaser.Gamepad#pad4 +* @property {boolean} pad4 - Gamepad #4 +* @readonly +*/ Object.defineProperty(Phaser.Gamepad.prototype, "pad4", { get: function () { @@ -486,7 +522,6 @@ Object.defineProperty(Phaser.Gamepad.prototype, "pad4", { }); - Phaser.Gamepad.BUTTON_0 = 0; Phaser.Gamepad.BUTTON_1 = 1; Phaser.Gamepad.BUTTON_2 = 2; @@ -540,4 +575,4 @@ Phaser.Gamepad.XBOX360_DPAD_DOWN = 13; Phaser.Gamepad.XBOX360_STICK_LEFT_X = 0; Phaser.Gamepad.XBOX360_STICK_LEFT_Y = 1; Phaser.Gamepad.XBOX360_STICK_RIGHT_X = 2; -Phaser.Gamepad.XBOX360_STICK_RIGHT_Y = 3; \ No newline at end of file +Phaser.Gamepad.XBOX360_STICK_RIGHT_Y = 3; diff --git a/src/input/GamepadButton.js b/src/input/GamepadButton.js index 030b713c..0b915faa 100644 --- a/src/input/GamepadButton.js +++ b/src/input/GamepadButton.js @@ -1,85 +1,85 @@ /** - * @author @karlmacklin - * @copyright 2013 Photon Storm Ltd. - * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} - */ +* @author @karlmacklin +* @copyright 2013 Photon Storm Ltd. +* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} +*/ /** - * @class Phaser.GamepadButton - * @classdesc If you need more fine-grained control over the handling of specific buttons you can create and use Phaser.GamepadButton objects. - * @constructor - * @param {Phaser.Game} game - Current game instance. - * @param {number} buttoncode - The button code this GamepadButton is responsible for. - */ +* @class Phaser.GamepadButton +* @classdesc If you need more fine-grained control over the handling of specific buttons you can create and use Phaser.GamepadButton objects. +* @constructor +* @param {Phaser.Game} game - Current game instance. +* @param {number} buttoncode - The button code this GamepadButton is responsible for. +*/ Phaser.GamepadButton = function (game, buttoncode) { /** - * @property {Phaser.Game} game - A reference to the currently running game. - */ + * @property {Phaser.Game} game - A reference to the currently running game. + */ this.game = game; /** - * @property {boolean} isDown - The "down" state of the button. - * @default - */ + * @property {boolean} isDown - The "down" state of the button. + * @default + */ this.isDown = false; /** - * @property {boolean} isUp - The "up" state of the button. - * @default - */ + * @property {boolean} isUp - The "up" state of the button. + * @default + */ this.isUp = false; /** - * @property {number} timeDown - The timestamp when the button was last pressed down. - * @default - */ + * @property {number} timeDown - The timestamp when the button was last pressed down. + * @default + */ this.timeDown = 0; /** - * If the button is down this value holds the duration of that button press and is constantly updated. - * If the button is up it holds the duration of the previous down session. - * @property {number} duration - The number of milliseconds this button has been held down for. - * @default - */ + * If the button is down this value holds the duration of that button press and is constantly updated. + * If the button is up it holds the duration of the previous down session. + * @property {number} duration - The number of milliseconds this button has been held down for. + * @default + */ this.duration = 0; /** - * @property {number} timeUp - The timestamp when the button was last released. - * @default - */ + * @property {number} timeUp - The timestamp when the button was last released. + * @default + */ this.timeUp = 0; /** - * @property {number} repeats - If a button is held down this holds down the number of times the button has 'repeated'. - * @default - */ + * @property {number} repeats - If a button is held down this holds down the number of times the button has 'repeated'. + * @default + */ this.repeats = 0; /** - * @property {number} value - Button value. Mainly useful for checking analog buttons (like shoulder triggers) - * @default - */ + * @property {number} value - Button value. Mainly useful for checking analog buttons (like shoulder triggers) + * @default + */ this.value = 0; /** - * @property {number} buttonCode - The buttoncode of this button. - */ + * @property {number} buttonCode - The buttoncode of this button. + */ this.buttonCode = buttoncode; /** - * @property {Phaser.Signal} onDown - This Signal is dispatched every time this GamepadButton is pressed down. It is only dispatched once (until the button is released again). - */ + * @property {Phaser.Signal} onDown - This Signal is dispatched every time this GamepadButton is pressed down. It is only dispatched once (until the button is released again). + */ this.onDown = new Phaser.Signal(); /** - * @property {Phaser.Signal} onUp - This Signal is dispatched every time this GamepadButton is pressed down. It is only dispatched once (until the button is released again). - */ + * @property {Phaser.Signal} onUp - This Signal is dispatched every time this GamepadButton is pressed down. It is only dispatched once (until the button is released again). + */ this.onUp = new Phaser.Signal(); /** - * @property {Phaser.Signal} onFloat - This Signal is dispatched every time this GamepadButton changes floating value (between (but not exactly) 0 and 1) - */ + * @property {Phaser.Signal} onFloat - This Signal is dispatched every time this GamepadButton changes floating value (between (but not exactly) 0 and 1) + */ this.onFloat = new Phaser.Signal(); }; @@ -87,18 +87,20 @@ Phaser.GamepadButton = function (game, buttoncode) { Phaser.GamepadButton.prototype = { /** - * Called automatically by Phaser.SinglePad. - * @method Phaser.GamepadButton#processButtonDown - * @param {Object} value - Button value - * @protected - */ + * Called automatically by Phaser.SinglePad. + * @method Phaser.GamepadButton#processButtonDown + * @param {Object} value - Button value + * @protected + */ processButtonDown: function (value) { - if (this.isDown) { + if (this.isDown) + { this.duration = this.game.time.now - this.timeDown; this.repeats++; } - else { + else + { this.isDown = true; this.isUp = false; this.timeDown = this.game.time.now; @@ -108,14 +110,15 @@ Phaser.GamepadButton.prototype = { this.onDown.dispatch(this, value); } + }, /** - * Called automatically by Phaser.SinglePad. - * @method Phaser.GamepadButton#processButtonUp - * @param {Object} value - Button value - * @protected - */ + * Called automatically by Phaser.SinglePad. + * @method Phaser.GamepadButton#processButtonUp + * @param {Object} value - Button value + * @protected + */ processButtonUp: function (value) { this.isDown = false; @@ -128,45 +131,45 @@ Phaser.GamepadButton.prototype = { }, /** - * Called automatically by Phaser.Gamepad. - * @method Phaser.GamepadButton#processButtonFloat - * @param {Object} value - Button value - * @protected - */ + * Called automatically by Phaser.Gamepad. + * @method Phaser.GamepadButton#processButtonFloat + * @param {Object} value - Button value + * @protected + */ processButtonFloat: function (value) { + this.value = value; this.onFloat.dispatch(this, value); + }, - /** - * Returns the "just pressed" state of this button. Just pressed is considered true if the button was pressed down within the duration given (default 250ms). - * @method Phaser.GamepadButton#justPressed - * @param {number} [duration=250] - The duration below which the button is considered as being just pressed. - * @return {boolean} True if the button is just pressed otherwise false. - */ + * Returns the "just pressed" state of this button. Just pressed is considered true if the button was pressed down within the duration given (default 250ms). + * @method Phaser.GamepadButton#justPressed + * @param {number} [duration=250] - The duration below which the button is considered as being just pressed. + * @return {boolean} True if the button is just pressed otherwise false. + */ justPressed: function (duration) { - if (typeof duration === "undefined") { - duration = 250; - } + if (typeof duration === "undefined") { duration = 250; } return (this.isDown && this.duration < duration); }, /** - * Returns the "just released" state of this button. Just released is considered as being true if the button was released within the duration given (default 250ms). - * @method Phaser.GamepadButton#justPressed - * @param {number} [duration=250] - The duration below which the button is considered as being just released. - * @return {boolean} True if the button is just pressed otherwise false. - */ + * Returns the "just released" state of this button. Just released is considered as being true if the button was released within the duration given (default 250ms). + * @method Phaser.GamepadButton#justPressed + * @param {number} [duration=250] - The duration below which the button is considered as being just released. + * @return {boolean} True if the button is just pressed otherwise false. + */ justReleased: function (duration) { - if (typeof duration === "undefined") { - duration = 250; - } + if (typeof duration === "undefined") { duration = 250; } return (this.isDown === false && (this.game.time.now - this.timeUp < duration)); } -}; \ No newline at end of file + +}; + +Phaser.GamepadButton.prototype.constructor = Phaser.GamepadButton; diff --git a/src/input/SinglePad.js b/src/input/SinglePad.js index c689a61b..9b55777e 100644 --- a/src/input/SinglePad.js +++ b/src/input/SinglePad.js @@ -1,114 +1,114 @@ /** - * @author @karlmacklin - * @copyright 2013 Photon Storm Ltd. - * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} - */ +* @author @karlmacklin +* @copyright 2013 Photon Storm Ltd. +* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} +*/ /** - * @class Phaser.SinglePad - * @classdesc A single Phaser Gamepad - * @constructor - * @param {Phaser.Game} game - Current game instance. - * @param {Object} padParent - The parent Phaser.Gamepad object (all gamepads reside under this) - */ +* @class Phaser.SinglePad +* @classdesc A single Phaser Gamepad +* @constructor +* @param {Phaser.Game} game - Current game instance. +* @param {Object} padParent - The parent Phaser.Gamepad object (all gamepads reside under this) +*/ Phaser.SinglePad = function (game, padParent) { /** - * @property {Phaser.Game} game - Local reference to game. - */ + * @property {Phaser.Game} game - Local reference to game. + */ this.game = game; /** - * @property {Phaser.Gamepad} padParent - Main Phaser Gamepad object - */ + * @property {Phaser.Gamepad} padParent - Main Phaser Gamepad object + */ this._padParent = padParent; /** - * @property {number} index - The gamepad index as per browsers data - * @default - */ + * @property {number} index - The gamepad index as per browsers data + * @default + */ this._index = null; /** - * @property {Object} _rawPad - The 'raw' gamepad data. - * @private - */ + * @property {Object} _rawPad - The 'raw' gamepad data. + * @private + */ this._rawPad = null; /** - * @property {boolean} _connected - Is this pad connected or not. - * @private - */ + * @property {boolean} _connected - Is this pad connected or not. + * @private + */ this._connected = false; /** - * @property {number} _prevTimestamp - Used to check for differences between earlier polls and current state of gamepads. - * @private - */ + * @property {number} _prevTimestamp - Used to check for differences between earlier polls and current state of gamepads. + * @private + */ this._prevTimestamp = null; /** - * @property {Array} _rawButtons - The 'raw' button state. - * @private - */ + * @property {Array} _rawButtons - The 'raw' button state. + * @private + */ this._rawButtons = []; /** - * @property {Array} _buttons - Current Phaser state of the buttons. - * @private - */ + * @property {Array} _buttons - Current Phaser state of the buttons. + * @private + */ this._buttons = []; /** - * @property {Array} _axes - Current axes state. - * @private - */ + * @property {Array} _axes - Current axes state. + * @private + */ this._axes = []; /** - * @property {Array} _hotkeys - Hotkey buttons. - * @private - */ + * @property {Array} _hotkeys - Hotkey buttons. + * @private + */ this._hotkeys = []; /** - * @property {Object} callbackContext - The context under which the callbacks are run. - */ + * @property {Object} callbackContext - The context under which the callbacks are run. + */ this.callbackContext = this; /** - * @property {function} onConnectCallback - This callback is invoked every time this gamepad is connected - */ + * @property {function} onConnectCallback - This callback is invoked every time this gamepad is connected + */ this.onConnectCallback = null; /** - * @property {function} onDisconnectCallback - This callback is invoked every time this gamepad is disconnected - */ + * @property {function} onDisconnectCallback - This callback is invoked every time this gamepad is disconnected + */ this.onDisconnectCallback = null; /** - * @property {function} onDownCallback - This callback is invoked every time a button is pressed down. - */ + * @property {function} onDownCallback - This callback is invoked every time a button is pressed down. + */ this.onDownCallback = null; /** - * @property {function} onUpCallback - This callback is invoked every time a gamepad button is released. - */ + * @property {function} onUpCallback - This callback is invoked every time a gamepad button is released. + */ this.onUpCallback = null; /** - * @property {function} onAxisCallback - This callback is invoked every time an axis is changed. - */ + * @property {function} onAxisCallback - This callback is invoked every time an axis is changed. + */ this.onAxisCallback = null; /** - * @property {function} onFloatCallback - This callback is invoked every time a button is changed to a value where value > 0 and value < 1. - */ + * @property {function} onFloatCallback - This callback is invoked every time a button is changed to a value where value > 0 and value < 1. + */ this.onFloatCallback = null; /** - * @property {number} deadZone - Dead zone for axis feedback - within this value you won't trigger updates. - */ + * @property {number} deadZone - Dead zone for axis feedback - within this value you won't trigger updates. + */ this.deadZone = 0.26; }; @@ -116,15 +116,16 @@ Phaser.SinglePad = function (game, padParent) { Phaser.SinglePad.prototype = { /** - * Add callbacks to the this Gamepad to handle connect/disconnect/button down/button up/axis change/float value buttons - * @method Phaser.Gamepad#addCallbacks - * @param {Object} context - The context under which the callbacks are run. - * @param {Object} callbacks - Object that takes six different callbak methods: - * onConnectCallback, onDisconnectCallback, onDownCallback, onUpCallback, onAxisCallback, onFloatCallback - */ + * Add callbacks to the this Gamepad to handle connect/disconnect/button down/button up/axis change/float value buttons + * @method Phaser.Gamepad#addCallbacks + * @param {Object} context - The context under which the callbacks are run. + * @param {Object} callbacks - Object that takes six different callbak methods: + * onConnectCallback, onDisconnectCallback, onDownCallback, onUpCallback, onAxisCallback, onFloatCallback + */ addCallbacks: function (context, callbacks) { - if (typeof callbacks !== 'undefined') { + if (typeof callbacks !== 'undefined') + { this.onConnectCallback = (typeof callbacks.onConnect === 'function') ? callbacks.onConnect : this.onConnectCallback; this.onDisconnectCallback = (typeof callbacks.onDisconnect === 'function') ? callbacks.onDisconnect : this.onDisconnectCallback; this.onDownCallback = (typeof callbacks.onDown === 'function') ? callbacks.onDown : this.onDownCallback; @@ -136,13 +137,13 @@ Phaser.SinglePad.prototype = { }, /** - * If you need more fine-grained control over a Key you can create a new Phaser.Key object via this method. - * The Key object can then be polled, have events attached to it, etc. - * - * @method Phaser.SinglePad#addButton - * @param {number} buttonCode - The buttonCode of the button, i.e. Phaser.Gamepad.BUTTON_0 or Phaser.Gamepad.BUTTON_1 - * @return {Phaser.GamepadButton} The GamepadButton object which you can store locally and reference directly. - */ + * If you need more fine-grained control over a Key you can create a new Phaser.Key object via this method. + * The Key object can then be polled, have events attached to it, etc. + * + * @method Phaser.SinglePad#addButton + * @param {number} buttonCode - The buttonCode of the button, i.e. Phaser.Gamepad.BUTTON_0 or Phaser.Gamepad.BUTTON_1 + * @return {Phaser.GamepadButton} The GamepadButton object which you can store locally and reference directly. + */ addButton: function (buttonCode) { this._hotkeys[buttonCode] = new Phaser.GamepadButton(this.game, buttonCode); @@ -151,49 +152,66 @@ Phaser.SinglePad.prototype = { }, /** - * Main update function, should be called by Phaser.Gamepad - * @method Phaser.SinglePad#pollStatus - */ + * Main update function, should be called by Phaser.Gamepad + * @method Phaser.SinglePad#pollStatus + */ pollStatus: function () { - if (this._rawPad.timestamp && (this._rawPad.timestamp == this._prevTimestamp)) { + + if (this._rawPad.timestamp && (this._rawPad.timestamp == this._prevTimestamp)) + { return; } - for (var i = 0; i < this._rawPad.buttons.length; i += 1) { + + for (var i = 0; i < this._rawPad.buttons.length; i += 1) + { var buttonValue = this._rawPad.buttons[i]; - if (this._rawButtons[i] !== buttonValue) { - if (buttonValue === 1) { + + if (this._rawButtons[i] !== buttonValue) + { + if (buttonValue === 1) + { this.processButtonDown(i, buttonValue); } - else if (buttonValue === 0) { + else if (buttonValue === 0) + { this.processButtonUp(i, buttonValue); - } else { + } + else + { this.processButtonFloat(i, buttonValue); } + this._rawButtons[i] = buttonValue; } } var axes = this._rawPad.axes; - for (var j = 0; j < axes.length; j += 1) { + for (var j = 0; j < axes.length; j += 1) + { var axis = axes[j]; - if (axis > 0 && axis > this.deadZone || - axis < 0 && axis < -this.deadZone) { + + if (axis > 0 && axis > this.deadZone || axis < 0 && axis < -this.deadZone) + { this.processAxisChange({axis: j, value: axis}); - } else { + } + else + { this.processAxisChange({axis: j, value: 0}); } } + this._prevTimestamp = this._rawPad.timestamp; }, /** - * Gamepad connect function, should be called by Phaser.Gamepad - * @param {Object} rawPad - The raw gamepad object - * @method Phaser.SinglePad#connect - */ + * Gamepad connect function, should be called by Phaser.Gamepad + * @param {Object} rawPad - The raw gamepad object + * @method Phaser.SinglePad#connect + */ connect: function (rawPad) { + var triggerCallback = !this._connected; this._index = rawPad.index; @@ -202,20 +220,24 @@ Phaser.SinglePad.prototype = { this._rawButtons = rawPad.buttons; this._axes = rawPad.axes; - if (triggerCallback && this._padParent.onConnectCallback) { + if (triggerCallback && this._padParent.onConnectCallback) + { this._padParent.onConnectCallback.call(this._padParent.callbackContext, this._index); } - if (triggerCallback && this.onConnectCallback) { + + if (triggerCallback && this.onConnectCallback) + { this.onConnectCallback.call(this.callbackContext); } }, /** - * Gamepad disconnect function, should be called by Phaser.Gamepad - * @method Phaser.SinglePad#disconnect - */ + * Gamepad disconnect function, should be called by Phaser.Gamepad + * @method Phaser.SinglePad#disconnect + */ disconnect: function () { + var triggerCallback = this._connected; this._connected = false; this._rawPad = undefined; @@ -224,64 +246,81 @@ Phaser.SinglePad.prototype = { var disconnectingIndex = this._index; this._index = null; - if (triggerCallback && this._padParent.onDisconnectCallback) { + if (triggerCallback && this._padParent.onDisconnectCallback) + { this._padParent.onDisconnectCallback.call(this._padParent.callbackContext, disconnectingIndex); } - if (triggerCallback && this.onDisconnectCallback) { + + if (triggerCallback && this.onDisconnectCallback) + { this.onDisconnectCallback.call(this.callbackContext); } + }, /** - * Handles changes in axis - * @param {Object} axisState - State of the relevant axis - * @method Phaser.SinglePad#processAxisChange - */ + * Handles changes in axis + * @param {Object} axisState - State of the relevant axis + * @method Phaser.SinglePad#processAxisChange + */ processAxisChange: function (axisState) { - if (this.game.input.disabled || this.game.input.gamepad.disabled) { + if (this.game.input.disabled || this.game.input.gamepad.disabled) + { return; } - if (this._axes[axisState.axis] === axisState.value) { + if (this._axes[axisState.axis] === axisState.value) + { return; } + this._axes[axisState.axis] = axisState.value; - if (this._padParent.onAxisCallback) { + + if (this._padParent.onAxisCallback) + { this._padParent.onAxisCallback.call(this._padParent.callbackContext, axisState, this._index); } - if (this.onAxisCallback) { + + if (this.onAxisCallback) + { this.onAxisCallback.call(this.callbackContext, axisState); } }, - /** - * Handles button down press - * @param {number} buttonCode - Which buttonCode of this button - * @param {Object} value - Button value - * @method Phaser.SinglePad#processButtonDown - */ + * Handles button down press + * @param {number} buttonCode - Which buttonCode of this button + * @param {Object} value - Button value + * @method Phaser.SinglePad#processButtonDown + */ processButtonDown: function (buttonCode, value) { - if (this.game.input.disabled || this.game.input.gamepad.disabled) { + + if (this.game.input.disabled || this.game.input.gamepad.disabled) + { return; } - if (this._padParent.onDownCallback) { + if (this._padParent.onDownCallback) + { this._padParent.onDownCallback.call(this._padParent.callbackContext, buttonCode, value, this._index); } - if (this.onDownCallback) { + if (this.onDownCallback) + { this.onDownCallback.call(this.callbackContext, buttonCode, value); } - if (this._buttons[buttonCode] && this._buttons[buttonCode].isDown) { + if (this._buttons[buttonCode] && this._buttons[buttonCode].isDown) + { // Key already down and still down, so update this._buttons[buttonCode].duration = this.game.time.now - this._buttons[buttonCode].timeDown; } - else { - if (!this._buttons[buttonCode]) { + else + { + if (!this._buttons[buttonCode]) + { // Not used this button before, so register it this._buttons[buttonCode] = { isDown: true, @@ -291,7 +330,8 @@ Phaser.SinglePad.prototype = { value: value }; } - else { + else + { // Button used before but freshly down this._buttons[buttonCode].isDown = true; this._buttons[buttonCode].timeDown = this.game.time.now; @@ -300,42 +340,50 @@ Phaser.SinglePad.prototype = { } } - if (this._hotkeys[buttonCode]) { + if (this._hotkeys[buttonCode]) + { this._hotkeys[buttonCode].processButtonDown(value); } }, /** - * Handles button release - * @param {number} buttonCode - Which buttonCode of this button - * @param {Object} value - Button value - * @method Phaser.SinglePad#processButtonUp - */ + * Handles button release + * @param {number} buttonCode - Which buttonCode of this button + * @param {Object} value - Button value + * @method Phaser.SinglePad#processButtonUp + */ processButtonUp: function (buttonCode, value) { - if (this.game.input.disabled || this.game.input.gamepad.disabled) { + + if (this.game.input.disabled || this.game.input.gamepad.disabled) + { return; } - if (this._padParent.onUpCallback) { + if (this._padParent.onUpCallback) + { this._padParent.onUpCallback.call(this._padParent.callbackContext, buttonCode, value, this._index); } - if (this.onUpCallback) { + if (this.onUpCallback) + { this.onUpCallback.call(this.callbackContext, buttonCode, value); } - if (this._hotkeys[buttonCode]) { + if (this._hotkeys[buttonCode]) + { this._hotkeys[buttonCode].processButtonUp(value); } - if (this._buttons[buttonCode]) { + if (this._buttons[buttonCode]) + { this._buttons[buttonCode].isDown = false; this._buttons[buttonCode].timeUp = this.game.time.now; this._buttons[buttonCode].value = value; } - else { - // Not used this key before, so register it + else + { + // Not used this button before, so register it this._buttons[buttonCode] = { isDown: false, timeDown: this.game.time.now, @@ -344,68 +392,77 @@ Phaser.SinglePad.prototype = { value: value }; } + }, /** - * Handles buttons with floating values (like analog buttons that acts almost like an axis but still registers like a button) - * @param {number} buttonCode - Which buttonCode of this button - * @param {Object} value - Button value (will range somewhere between 0 and 1, but not specifically 0 or 1. - * @method Phaser.SinglePad#processButtonFloat - */ + * Handles buttons with floating values (like analog buttons that acts almost like an axis but still registers like a button) + * @param {number} buttonCode - Which buttonCode of this button + * @param {Object} value - Button value (will range somewhere between 0 and 1, but not specifically 0 or 1. + * @method Phaser.SinglePad#processButtonFloat + */ processButtonFloat: function (buttonCode, value) { - if (this.game.input.disabled || this.game.input.gamepad.disabled) { + + if (this.game.input.disabled || this.game.input.gamepad.disabled) + { return; } - if (this._padParent.onFloatCallback) { + if (this._padParent.onFloatCallback) + { this._padParent.onFloatCallback.call(this._padParent.callbackContext, buttonCode, value, this._index); } - if (this.onFloatCallback) { + if (this.onFloatCallback) + { this.onFloatCallback.call(this.callbackContext, buttonCode, value); } - - if (!this._buttons[buttonCode]) { + if (!this._buttons[buttonCode]) + { // Not used this button before, so register it - this._buttons[buttonCode] = { - value: value - }; + this._buttons[buttonCode] = { value: value }; } - else { + else + { // Button used before but freshly down this._buttons[buttonCode].value = value; } - if (this._hotkeys[buttonCode]) { + if (this._hotkeys[buttonCode]) + { this._hotkeys[buttonCode].processButtonFloat(value); } }, /** - * Returns value of requested axis - * @method Phaser.SinglePad#isDown - * @param {number} axisCode - The index of the axis to check - * @return {number} Axis value if available otherwise false - */ + * Returns value of requested axis + * @method Phaser.SinglePad#isDown + * @param {number} axisCode - The index of the axis to check + * @return {number} Axis value if available otherwise false + */ axis: function (axisCode) { - if (this._axes[axisCode]) { + + if (this._axes[axisCode]) + { return this._axes[axisCode]; } return false; + }, /** - * Returns true if the button is currently pressed down. - * @method Phaser.SinglePad#isDown - * @param {number} buttonCode - The buttonCode of the key to check. - * @return {boolean} True if the key is currently down. - */ + * Returns true if the button is currently pressed down. + * @method Phaser.SinglePad#isDown + * @param {number} buttonCode - The buttonCode of the key to check. + * @return {boolean} True if the key is currently down. + */ isDown: function (buttonCode) { - if (this._buttons[buttonCode]) { + if (this._buttons[buttonCode]) + { return this._buttons[buttonCode].isDown; } @@ -413,59 +470,47 @@ Phaser.SinglePad.prototype = { }, - /** - * Returns the "just released" state of a button from this gamepad. Just released is considered as being true if the button was released within the duration given (default 250ms). - * @method Phaser.SinglePad#justPressed - * @param {number} buttonCode - The buttonCode of the button to check for. - * @param {number} [duration=250] - The duration below which the button is considered as being just released. - * @return {boolean} True if the button is just released otherwise false. - */ + * Returns the "just released" state of a button from this gamepad. Just released is considered as being true if the button was released within the duration given (default 250ms). + * @method Phaser.SinglePad#justPressed + * @param {number} buttonCode - The buttonCode of the button to check for. + * @param {number} [duration=250] - The duration below which the button is considered as being just released. + * @return {boolean} True if the button is just released otherwise false. + */ justReleased: function (buttonCode, duration) { - if (typeof duration === "undefined") { - duration = 250; - } + if (typeof duration === "undefined") { duration = 250; } - if (this._buttons[buttonCode] && this._buttons[buttonCode].isDown === false && (this.game.time.now - this._buttons[buttonCode].timeUp < duration)) { - return true; - } - - return false; + return (this._buttons[buttonCode] && this._buttons[buttonCode].isDown === false && (this.game.time.now - this._buttons[buttonCode].timeUp < duration)); }, /** - * Returns the "just pressed" state of a button from this gamepad. Just pressed is considered true if the button was pressed down within the duration given (default 250ms). - * @method Phaser.SinglePad#justPressed - * @param {number} buttonCode - The buttonCode of the button to check for. - * @param {number} [duration=250] - The duration below which the button is considered as being just pressed. - * @return {boolean} True if the button is just pressed otherwise false. - */ + * Returns the "just pressed" state of a button from this gamepad. Just pressed is considered true if the button was pressed down within the duration given (default 250ms). + * @method Phaser.SinglePad#justPressed + * @param {number} buttonCode - The buttonCode of the button to check for. + * @param {number} [duration=250] - The duration below which the button is considered as being just pressed. + * @return {boolean} True if the button is just pressed otherwise false. + */ justPressed: function (buttonCode, duration) { - if (typeof duration === "undefined") { - duration = 250; - } + if (typeof duration === "undefined") { duration = 250; } - if (this._buttons[buttonCode] && this._buttons[buttonCode].isDown && this._buttons[buttonCode].duration < duration) { - return true; - } - - return false; + return (this._buttons[buttonCode] && this._buttons[buttonCode].isDown && this._buttons[buttonCode].duration < duration); }, /** - * Returns the value of a gamepad button. Intended mainly for cases when you have floating button values, for example - * analog trigger buttons on the XBOX 360 controller - * @method Phaser.SinglePad#buttonValue - * @param {number} buttonCode - The buttonCode of the button to check. - * @return {boolean} Button value if available otherwise false. - */ + * Returns the value of a gamepad button. Intended mainly for cases when you have floating button values, for example + * analog trigger buttons on the XBOX 360 controller + * @method Phaser.SinglePad#buttonValue + * @param {number} buttonCode - The buttonCode of the button to check. + * @return {boolean} Button value if available otherwise false. + */ buttonValue: function (buttonCode) { - if (this._buttons[buttonCode]) { + if (this._buttons[buttonCode]) + { return this._buttons[buttonCode].value; } @@ -474,20 +519,27 @@ Phaser.SinglePad.prototype = { }, /** - * Reset all buttons/axes of this gamepad - * @method Phaser.SinglePad#reset - */ + * Reset all buttons/axes of this gamepad + * @method Phaser.SinglePad#reset + */ reset: function () { - for (var i = 0; i < this._buttons.length; i += 1) { + + for (var i = 0; i < this._buttons.length; i++) + { this._buttons[i] = 0; } - for (var j = 0; j < this._axes.length; j += 1) { + + for (var j = 0; j < this._axes.length; j++) + { this._axes[j] = 0; } + } }; +Phaser.SinglePad.prototype.constructor = Phaser.SinglePad; + /** * Whether or not this particular gamepad is connected or not. * @name Phaser.SinglePad#connected @@ -514,4 +566,4 @@ Object.defineProperty(Phaser.SinglePad.prototype, "index", { return this._index; } -}); \ No newline at end of file +});