1

我正在尝试扩展本机 GamepadAPI 以包含自定义控制器代码。

使用 TypeScript,我实现了一个简单的函数来调度“gamepadconnected”事件。

    // simulate gamepadconnected event
    function dispatchGamepadConnectedEvent() {
        let gamepad = Object.create(Gamepad.prototype);
        console.log(gamepad);
        let event = new GamepadEvent('gamepadconnected', {
            gamepad: gamepad
        })
        window.dispatchEvent(event);
        console.log('Gamepad connect event dispatched.');
    }

但是,在调度事件时,我收到一个错误:


Gamepad {}axes: (...)buttons: (...)connected: (...)id: (...)index: (...)mapping: (...)timestamp: (...)vibrationActuator: (...)__proto__: Gamepad

extension.ts:37 Uncaught TypeError: Failed to construct 'GamepadEvent': member gamepad is not of type Gamepad.
    at dispatchGamepadConnectedEvent (extension.ts:37)
    at extension.ts:48

尽管实例化的 Gamepad 对象看起来不错,但 Gamepad 的类型并不正确。为什么会这样?如何创建一个新的、正确的 Gamepad 对象来触发本机事件?

4

2 回答 2

0

您不能创建本机 Gamepad 对象。

Object.create(Gamepad.prototype)不创建游戏手柄。它创建一个对象并将其原型设置为 Gamepad.prototype。虽然这种诡计通常适用于应用程序级 API,但它不会欺骗原生浏览器 API。

您的选择是:

  1. 传递空值:{gamepad: null}
  2. 传递实际的游戏手柄参考{gamepad: navigator.getGamepads()[0]}
  3. 调度 CustomEvent,而不是 GamepadEvent。
  4. 完全尝试其他东西。
于 2019-09-29T19:30:51.730 回答
0

不确定您的问题背后的用例,但一种替代方法可能是使用WebHID API。我最近使用这个 API在 JavaScript中创建了一个Nintendo Joy-Con 驱动程序。如果碰巧对您的设备进行了逆向工程(提示:检查是否有 Linux 驱动程序),您很可能可以使用它通过 WebHID 与您的设备通信。

于 2020-12-16T11:56:57.400 回答