From e39185a16e23e14ddb0b4a1fc628eeb262aa31fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com> Date: Mon, 14 Nov 2022 20:37:01 +0000 Subject: [PATCH] feat: support for thumb sticks --- .../components/keyboard-gb/keyboard-gb.tsx | 62 +++++++++++++------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/examples/web/react/components/keyboard-gb/keyboard-gb.tsx b/examples/web/react/components/keyboard-gb/keyboard-gb.tsx index 5e3368dd..cb77d689 100644 --- a/examples/web/react/components/keyboard-gb/keyboard-gb.tsx +++ b/examples/web/react/components/keyboard-gb/keyboard-gb.tsx @@ -15,9 +15,13 @@ const KEYS: Record<string, string> = { const KEYS_XBOX: Record<number, string> = { 12: "ArrowUp", + 102: "ArrowUp", 13: "ArrowDown", + 103: "ArrowDown", 14: "ArrowLeft", + 100: "ArrowLeft", 15: "ArrowRight", + 101: "ArrowRight", 9: "Start", 8: "Select", 1: "A", @@ -83,7 +87,7 @@ export const KeyboardGB: FC<KeyboardGBProps> = ({ if (!physical) return; const getGamepadType = (gamepad: globalThis.Gamepad): Gamepad => { let gamepadType = Gamepad.Unknown; - const isXbox = gamepad.id.startsWith("Xbox"); + const isXbox = gamepad.id.includes("Xbox"); if (isXbox) gamepadType = Gamepad.Xbox; return gamepadType; }; @@ -126,35 +130,53 @@ export const KeyboardGB: FC<KeyboardGBProps> = ({ } const buttonStates: Record<number, boolean> = {}; + const updateStatus = () => { const _gamepad = navigator.getGamepads()[gamepad.index]; if (!_gamepad) return; - _gamepad.buttons.forEach((button, index) => { - const keyCode = keySolver[index]; - if (keyCode === undefined) return; - const state = buttonStates[index] ?? false; - const pressed = button.value === 1; - const keyDown = pressed && !state; - const keyUp = !pressed && state; - if (keyDown) { - const records = recordRef.current ?? {}; - const setter = records[keyCode]; - setter(true); - onKeyDown && onKeyDown(keyCode); - } + handleButton(100, _gamepad.axes[0] < -0.5); + handleButton(101, _gamepad.axes[0] > 0.5); + handleButton(102, _gamepad.axes[1] < -0.5); + handleButton(103, _gamepad.axes[1] > 0.5); - if (keyUp) { - const records = recordRef.current ?? {}; - const setter = records[keyCode]; - setter(false); - onKeyUp && onKeyUp(keyCode); + _gamepad.buttons.forEach((button, index) => { + const pressed = button.pressed; + + if (pressed) { + console.info(index); } - buttonStates[index] = pressed; + handleButton(index, pressed); }); + requestAnimationFrame(updateStatus); }; + + const handleButton = (index: number, pressed: boolean) => { + const keyCode = keySolver[index]; + if (keyCode === undefined) return; + const state = buttonStates[index] ?? false; + const keyDown = pressed && !state; + const keyUp = !pressed && state; + + if (keyDown) { + const records = recordRef.current ?? {}; + const setter = records[keyCode]; + setter(true); + onKeyDown && onKeyDown(keyCode); + } + + if (keyUp) { + const records = recordRef.current ?? {}; + const setter = records[keyCode]; + setter(false); + onKeyUp && onKeyUp(keyCode); + } + + buttonStates[index] = pressed; + }; + requestAnimationFrame(updateStatus); }; const onGamepadDisconnected = (event: GamepadEvent) => { -- GitLab