aboutsummaryrefslogtreecommitdiff
path: root/lib/systems
diff options
context:
space:
mode:
authorRubén Beltrán del Río <ben@nsovocal.com>2018-05-29 00:29:27 -0500
committerGitHub <noreply@github.com>2018-05-29 00:29:27 -0500
commit43413defcb854c8706a84a6a54a61c7977b52614 (patch)
tree815be23b2a4bccc9362ea1b63a2ee8f02361e848 /lib/systems
parent1676911c8a2621274bf75ff7271faa926cf58d6c (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.js41
-rw-r--r--lib/systems/grab.js4
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;