react-use-gamepad
Version:
Event driven functionality for the GamepadAPI
69 lines • 2.78 kB
JavaScript
import { useEffect, useRef } from 'react';
export default function GamepadEventDispatcher() {
var gameLoopRef = useRef(null);
var gamepadConnectedRef = useRef(false);
var gamepadRef = useRef(null);
var sendButtonEvent = function (buttonNum, lastVal, curVal) {
var eventName = !lastVal && curVal ? 'gamepadbuttondown' : 'gamepadbuttonup';
var event = new CustomEvent(eventName, {
detail: { buttonNumber: buttonNum },
});
window.dispatchEvent(event);
};
var sendJoystickEvent = function (index, value) {
var event = new CustomEvent('joystickmove', {
detail: {
index: index,
value: value,
},
});
window.dispatchEvent(event);
};
var gameLoop = function (index) {
var gamepads = navigator.getGamepads();
var gp = gamepads === null || gamepads === void 0 ? void 0 : gamepads[index];
if (!gp)
return;
if (gamepadRef.current) {
gamepadRef.current.buttons.forEach(function (button, i) {
var lastVal = button.pressed;
var curVal = gp.buttons[i].pressed;
if (lastVal !== curVal)
sendButtonEvent(i, lastVal, curVal);
});
gamepadRef.current.axes.forEach(function (axis, i) {
sendJoystickEvent(i, axis);
});
}
gamepadRef.current = gp;
gameLoopRef.current = requestAnimationFrame(function () { return gameLoop(index); });
};
useEffect(function () {
var handleGamepadConnected = function (_a) {
var index = _a.gamepad.index;
gamepadRef.current = navigator.getGamepads()[index];
if (gamepadRef.current)
gameLoop(index);
};
var handleGamepadDisconnected = function () {
gamepadRef.current = null;
gamepadConnectedRef.current = false;
if (gameLoopRef.current !== null) {
cancelAnimationFrame(gameLoopRef.current);
gameLoopRef.current = null;
}
};
window.addEventListener('gamepadconnected', handleGamepadConnected);
window.addEventListener('gamepaddisconnected', handleGamepadDisconnected);
return function () {
window.removeEventListener('gamepadconnected', handleGamepadConnected);
window.removeEventListener('gamepaddisconnected', handleGamepadDisconnected);
if (gamepadConnectedRef.current) {
handleGamepadDisconnected();
}
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return null;
}
//# sourceMappingURL=GamepadEventDispatcher.js.map