UNPKG

react-use-gamepad

Version:

Event driven functionality for the GamepadAPI

69 lines 2.78 kB
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