phaser/src/input/gamepad/GamepadManager.js

401 lines
8.8 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}
*/
2017-09-09 02:17:13 +00:00
var Class = require('../../utils/Class');
var EventEmitter = require('eventemitter3');
2017-09-09 02:17:13 +00:00
var Gamepad = require('./Gamepad');
// https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API
// https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
// https://www.smashingmagazine.com/2015/11/gamepad-api-in-web-games/
// http://html5gamepad.com/
2017-09-09 02:17:13 +00:00
2018-03-19 12:43:19 +00:00
/**
* @typedef {object} Pad
*
* @property {string} id - [description]
2018-03-30 11:33:31 +00:00
* @property {integer} index - [description]
2018-03-19 12:43:19 +00:00
*/
/**
* @callback GamepadHandler
*
* @property {GamepadEvent} event - [description]
*/
2018-02-07 15:27:21 +00:00
/**
* @classdesc
* [description]
*
* @class GamepadManager
* @extends Phaser.Events.EventEmitter
2018-02-07 15:27:21 +00:00
* @memberOf Phaser.Input.Gamepad
* @constructor
* @since 3.0.0
*
* @param {Phaser.Input.InputManager} inputManager - [description]
*/
2017-09-09 02:17:13 +00:00
var GamepadManager = new Class({
Extends: EventEmitter,
2017-09-09 02:17:13 +00:00
initialize:
function GamepadManager (inputManager)
{
EventEmitter.call(this);
2018-01-26 06:55:15 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Gamepad.GamepadManager#manager
* @type {Phaser.Input.InputManager}
2018-01-26 06:55:15 +00:00
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
this.manager = inputManager;
2018-01-26 06:55:15 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Gamepad.GamepadManager#enabled
* @type {boolean}
2018-01-26 06:55:15 +00:00
* @default false
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
this.enabled = false;
2018-01-26 06:55:15 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Gamepad.GamepadManager#target
2018-03-19 12:43:19 +00:00
* @type {?object}
2018-01-26 06:55:15 +00:00
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
this.target;
2018-01-26 06:55:15 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Gamepad.GamepadManager#handler
* @type {?GamepadHandler}
2018-01-26 06:55:15 +00:00
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
this.handler;
2018-01-26 06:55:15 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Gamepad.GamepadManager#gamepads
2018-03-19 12:43:19 +00:00
* @type {Phaser.Input.Gamepad.Gamepad[]}
2018-01-26 06:55:15 +00:00
* @default []
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
this.gamepads = [];
2018-01-26 06:55:15 +00:00
/**
* Standard FIFO queue.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Gamepad.GamepadManager#queue
2018-03-19 12:43:19 +00:00
* @type {GamepadEvent[]}
2018-01-26 06:55:15 +00:00
* @default []
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
this.queue = [];
inputManager.events.once('boot', this.boot, this);
2017-09-09 02:17:13 +00:00
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#boot
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
boot: function ()
{
var config = this.manager.config;
this.enabled = config.inputGamepad && this.manager.game.device.input.gamepads;
2017-09-09 02:17:13 +00:00
this.target = window;
if (this.enabled)
{
this.startListeners();
}
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#startListeners
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
startListeners: function ()
{
var queue = this.queue;
2018-01-26 06:55:15 +00:00
var handler = function handler (event)
2017-09-09 02:17:13 +00:00
{
2018-01-03 16:30:51 +00:00
if (event.defaultPrevented)
2017-09-09 02:17:13 +00:00
{
// Do nothing if event already handled
return;
}
queue.push(event);
};
this.handler = handler;
2018-01-26 06:55:15 +00:00
var target = this.target;
target.addEventListener('gamepadconnected', handler, false);
target.addEventListener('gamepaddisconnected', handler, false);
2017-09-09 02:17:13 +00:00
// FF only for now:
2018-01-26 06:55:15 +00:00
target.addEventListener('gamepadbuttondown', handler, false);
target.addEventListener('gamepadbuttonup', handler, false);
target.addEventListener('gamepadaxismove', handler, false);
// Finally, listen for an update event from the Input Manager
this.manager.events.on('update', this.update, this);
2017-09-09 02:17:13 +00:00
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#stopListeners
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
stopListeners: function ()
{
2018-01-26 06:55:15 +00:00
var target = this.target;
var handler = this.handler;
target.removeEventListener('gamepadconnected', handler);
target.removeEventListener('gamepaddisconnected', handler);
2017-09-09 02:17:13 +00:00
2018-01-26 06:55:15 +00:00
target.removeEventListener('gamepadbuttondown', handler);
target.removeEventListener('gamepadbuttonup', handler);
target.removeEventListener('gamepadaxismove', handler);
this.manager.events.off('update', this.update);
2017-09-09 02:17:13 +00:00
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#disconnectAll
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
disconnectAll: function ()
{
for (var i = 0; i < this.gamepads.length; i++)
{
this.gamepads.connected = false;
}
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#addPad
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {Pad} pad - [description]
2018-01-26 06:55:15 +00:00
*
2018-03-19 12:43:19 +00:00
* @return {Phaser.Input.Gamepad.Gamepad} [description]
2018-01-26 06:55:15 +00:00
*/
2017-09-09 02:17:13 +00:00
addPad: function (pad)
{
var gamepad = new Gamepad(this, pad.id, pad.index);
this.gamepads[pad.index] = gamepad;
return gamepad;
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#removePad
* @since 3.0.0
2018-02-16 19:08:50 +00:00
* @todo Code this feature
2018-01-26 06:55:15 +00:00
*
2018-03-19 12:43:19 +00:00
* @param {number} index - [description]
* @param {Pad} pad - [description]
2018-01-26 06:55:15 +00:00
*/
2018-02-16 19:08:50 +00:00
removePad: function ()
2017-09-09 02:17:13 +00:00
{
2018-01-26 06:55:15 +00:00
// TODO
2017-09-09 02:17:13 +00:00
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#refreshPads
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {Pad[]} pads - [description]
2018-01-26 06:55:15 +00:00
*/
2017-09-09 02:17:13 +00:00
refreshPads: function (pads)
{
if (!pads)
2017-09-09 02:17:13 +00:00
{
this.disconnectAll();
}
else
{
for (var i = 0; i < pads.length; i++)
{
var pad = pads[i];
if (!pad)
2017-09-09 02:17:13 +00:00
{
// removePad?
continue;
}
if (this.gamepads[pad.index] === undefined)
{
this.addPad(pad);
}
this.gamepads[pad.index].update(pad);
}
}
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#getAll
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @return {Phaser.Input.Gamepad.Gamepad[]} [description]
2018-01-26 06:55:15 +00:00
*/
getAll: function ()
{
var out = [];
for (var i = 0; i < this.gamepads.length; i++)
{
if (this.gamepads[i])
{
out.push(this.gamepads[i]);
}
}
return out;
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#getPad
* @since 3.0.0
*
2018-03-19 12:43:19 +00:00
* @param {number} index - [description]
2018-01-26 06:55:15 +00:00
*
2018-03-19 12:43:19 +00:00
* @return {Phaser.Input.Gamepad.Gamepad} [description]
2018-01-26 06:55:15 +00:00
*/
getPad: function (index)
{
for (var i = 0; i < this.gamepads.length; i++)
{
if (this.gamepads[i].index === index)
{
return this.gamepads[i];
}
}
},
2018-01-26 06:55:15 +00:00
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#update
* @since 3.0.0
*/
2017-09-09 02:17:13 +00:00
update: function ()
{
if (!this.enabled)
{
return;
}
this.refreshPads(navigator.getGamepads());
var len = this.queue.length;
if (len === 0)
{
return;
}
var queue = this.queue.splice(0, len);
// Process the event queue, dispatching all of the events that have stored up
for (var i = 0; i < len; i++)
{
var event = queue[i];
var pad;
2017-09-09 02:17:13 +00:00
switch (event.type)
{
case 'gamepadconnected':
pad = this.getPad(event.gamepad.index);
this.emit('connected', pad, event);
2017-09-09 02:17:13 +00:00
break;
case 'gamepaddisconnected':
pad = this.getPad(event.gamepad.index);
this.emit('disconnected', pad, event);
2017-09-09 02:17:13 +00:00
break;
}
}
},
/**
* [description]
*
* @method Phaser.Input.Gamepad.GamepadManager#destroy
* @since 3.0.0
*/
destroy: function ()
{
this.stopListeners();
this.disconnectAll();
this.gamepads = [];
},
2018-01-26 06:55:15 +00:00
/**
* The total number of connected game pads.
2018-03-19 12:43:19 +00:00
*
2018-01-26 06:55:15 +00:00
* @name Phaser.Input.Gamepad.GamepadManager#total
2018-02-13 01:13:12 +00:00
* @type {number}
2018-01-26 06:55:15 +00:00
* @since 3.0.0
*/
total: {
get: function ()
{
return this.gamepads.length;
}
2017-09-09 02:17:13 +00:00
}
});
module.exports = GamepadManager;