diff options
| author | Rubén Beltrán del Río <ben@nsovocal.com> | 2018-05-29 00:29:27 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-05-29 00:29:27 -0500 |
| commit | 43413defcb854c8706a84a6a54a61c7977b52614 (patch) | |
| tree | 815be23b2a4bccc9362ea1b63a2ee8f02361e848 /lib/systems | |
| parent | 1676911c8a2621274bf75ff7271faa926cf58d6c (diff) | |
Add gamepad support (#10)
* Update docs
* Add gamepad support
* Remove console logs
* Add factories for controllables
* Add both controllables
* Add gamepad support to changelog
Diffstat (limited to 'lib/systems')
| -rw-r--r-- | lib/systems/control_mapper.js | 41 | ||||
| -rw-r--r-- | lib/systems/grab.js | 4 |
2 files changed, 40 insertions, 5 deletions
diff --git a/lib/systems/control_mapper.js b/lib/systems/control_mapper.js index e91ecc6..c39aea3 100644 --- a/lib/systems/control_mapper.js +++ b/lib/systems/control_mapper.js @@ -2,9 +2,11 @@ import { System } from '@serpentity/serpentity'; import ControllableNode from '../nodes/controllable'; -/* global window */ +/* global navigator window */ const internals = { + gamepadState: { + }, keyboardState: { } }; @@ -32,6 +34,7 @@ export default class ControlMapperSystem extends System { this.controllables = null; this._initializeKeyboard(); + this._initializeGamepad(); } /** @@ -71,11 +74,21 @@ export default class ControlMapperSystem extends System { */ update(currentFrameDuration) { + this._updateGamepads(); + for (const controllable of this.controllables) { for (const map of controllable.controlMap.map) { if (map.source.type === 'keyboard') { this._setValue(controllable.entity, map.target, !!internals.keyboardState[map.source.index]); } + + if (map.source.type === 'gamepad') { + const gamepad = internals.gamepadState[map.source.gamepadNumber]; + if (gamepad) { + const source = gamepad[map.source.gamepadInputSource]; + source && this._setValue(controllable.entity, map.target, source[map.source.index]); + } + } } } } @@ -95,6 +108,32 @@ export default class ControlMapperSystem extends System { }); } + // Requests gamepad access and binds to the events + + _initializeGamepad() { + + window.addEventListener('gamepadconnected', (event) => { + + internals.gamepadState[event.gamepad.index] = event.gamepad; + window.gamepad = event.gamepad; + }); + + window.addEventListener('gamepaddisconnected', (event) => { + + delete internals.gamepadState[event.gamepad.index]; + }); + } + + // Update Gamepad + + _updateGamepads() { + + const gamepads = navigator.getGamepads(); + for (const index of Object.keys(internals.gamepadState)) { + internals.gamepadState[index] = gamepads[index]; + } + } + // Sets the value to a target _setValue(entity, target, value) { diff --git a/lib/systems/grab.js b/lib/systems/grab.js index 43e6246..c50d1d9 100644 --- a/lib/systems/grab.js +++ b/lib/systems/grab.js @@ -131,8 +131,6 @@ export default class GrabSystem extends System { Body.setPosition(grabber.grabArea.area, grabber.body.body.position); - console.log('Grab!'); - for (const grabbable of this.grabbables) { if (grabbable.entity === grabber.entity) { @@ -142,7 +140,6 @@ export default class GrabSystem extends System { const collision = SAT.collides(grabber.grabArea.area, grabbable.body.body); if (collision.collided) { grab.constraint = this._createConstraint(grabber.body.body, grabbable.body.body); - console.log('Grabbing', grab.constraint); } } } @@ -158,7 +155,6 @@ export default class GrabSystem extends System { _release(grabber) { - console.log('Releasing', grabber.grab.constraint); World.remove(this.engine.world, grabber.grab.constraint); grabber.grab.currentCooldown = 0; grabber.grab.constraint = null; |