From 49d2c554ef5b50cef28c5efb1229593d301526c0 Mon Sep 17 00:00:00 2001 From: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com> Date: Sat, 24 Jun 2023 22:18:12 -0500 Subject: [PATCH] push gamepad script --- src/emulator.js | 2 ++ src/gamepad.js | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ src/loader.js | 1 + 3 files changed, 95 insertions(+) create mode 100644 src/gamepad.js diff --git a/src/emulator.js b/src/emulator.js index 932ec23..b7c3be9 100644 --- a/src/emulator.js +++ b/src/emulator.js @@ -422,6 +422,7 @@ class EmulatorJS { this.createControlSettingMenu(); this.setVirtualGamepad(); this.addEventListener(document, "keydown keyup", this.keyChange.bind(this)); + //this.gamepad = new GamepadHandler(); //https://github.com/ethanaobrien/Gamepad //keyboard, etc... } createContextMenu() { @@ -893,6 +894,7 @@ class EmulatorJS { this.controlPopup = popupMsg; popup.appendChild(popupMsg); this.controlMenu.appendChild(popup); + } defaultControllers = { 0: { diff --git a/src/gamepad.js b/src/gamepad.js new file mode 100644 index 0000000..02a6b9e --- /dev/null +++ b/src/gamepad.js @@ -0,0 +1,92 @@ +class GamepadHandler { + gamepads; + timeout; + listeners; + constructor() { + this.gamepads = []; + this.listeners = {}; + this.timeout = null; + this.loop(); + } + terminate() { + window.clearTimeout(this.timeout); + } + getGamepads() { + return navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []); + } + loop() { + this.updateGamepadState(); + this.timeout = setTimeout(this.loop.bind(this), 10); + } + updateGamepadState() { + const gamepads = this.getGamepads(); + gamepads.forEach((gamepad, index) => { + if (!gamepad) return; + let hasGamepad = false; + this.gamepads.forEach((oldGamepad, oldIndex) => { + if (oldGamepad.index !== gamepad.index) return; + hasGamepad = true; + + oldGamepad.axes.forEach((axis, axisIndex) => { + if (gamepad.axes[axisIndex] !== axis) { + const axis = ['LEFT_STICK_X', 'LEFT_STICK_Y', 'RIGHT_STICK_X', 'RIGHT_STICK_Y'][axisIndex]; + if (!axis) return; + this.dispatchEvent('axischanged', {axis: axis, value: gamepad.axes[axisIndex], index: gamepad.index, gamepadIndex: gamepad.index}); + } + + }) + gamepad.buttons.forEach((button, buttonIndex) => { + let pressed = oldGamepad.buttons[buttonIndex] === 1.0; + if (typeof oldGamepad.buttons[buttonIndex] === "object") { + pressed = oldGamepad.buttons[buttonIndex].pressed; + } + let pressed2 = button === 1.0; + if (typeof button === "object") { + pressed2 = button.pressed; + } + if (pressed !== pressed2) { + if (pressed2) { + this.dispatchEvent('buttondown', {index: buttonIndex, gamepadIndex: gamepad.index}); + } else { + this.dispatchEvent('buttonup', {index: buttonIndex, gamepadIndex: gamepad.index}); + } + } + + }) + this.gamepads[oldIndex] = gamepads[index]; + }) + if (!hasGamepad) { + this.gamepads.push(gamepads[index]); + this.dispatchEvent('connected', {gamepadIndex: gamepad.index}); + } + }); + + for (let j=0; j