游戏手柄 API“gamepadconnected”不起作用
Posted
技术标签:
【中文标题】游戏手柄 API“gamepadconnected”不起作用【英文标题】:Gamepad API "gamepadconnected" not working 【发布时间】:2017-06-24 11:04:19 【问题描述】:我正在使用无法正常工作的 Gamepad API“gamepadconnected”功能。但是,“gamepaddisconnected”功能出于某种原因起作用。连接我的蓝牙控制器后,控制台中没有显示任何内容,但是,它确实显示了断开连接时显示的信息。
我这里的东西是非常基本和标准的:
window.addEventListener("gamepadconnected", function(e)
console.log("Controller connected");
);
window.addEventListener("gamepaddisconnected", function(e)
console.log("Controller disconnected");
);
我在这里缺少什么?哪里出错了?我确保第一个焦点页面是带有上述脚本的页面。感谢您的帮助。
【问题讨论】:
您使用的是哪个浏览器?你试过webkitgamepadconnected
或mozgamepadconnected
吗?
我用的是 Chrome,没试过。我猜我应该尝试使用 webkitgamepadconnected?
不幸的是,这似乎不起作用。
好的,我发现发生了什么。连接事件仅在您重新启动选项卡时触发。由于某种原因无法刷新页面。
我相信这是意料之中的。 MDN 声明“如果在页面加载时游戏手柄已经连接,则当用户按下按钮或移动轴时,gamepadconnected 事件将被调度到焦点页面。”。 developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/…
【参考方案1】:
MDN 声明“如果在页面加载时已连接游戏手柄,则当用户按下按钮或移动轴时,gamepadconnected 事件将调度到焦点页面。”。因此,当您连接 pad 时,您的页面不会总是收到 gamepadconnected
事件。 https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
所以最好是例如让用户按下一个按钮来启动您的应用程序。当有多个游戏手柄连接到计算机并且您的应用程序必须知道要使用哪个游戏手柄时,这也很有用。
【讨论】:
【参考方案2】:Chrome 臭名昭著(在使用它之后对我来说肯定是!),容我们说,单独 实现 GamePad API。一个问题是,据我所知,它还没有可靠地支持“gamepadconnected”事件,并且您必须轮询 GamePad 对象的 gamePadConnected 属性才能对连接和断开连接做任何明智的事情。我知道这很痛苦,但这可能反映了这个 API 的 W3C 标准仍在不断变化的事实。您还会发现还有其他问题,例如 Windows 上的浏览器 X 与 Linux 上的浏览器 X 的行为不同。
我不知道是否有人尝试将这些设备插入 android 或 ios 设备(对于带有触摸屏的设备的要求可能是多余的,除非您打算将飞行 sim 移植到其中!),但我怀疑更多如果进行这些实验,将会出现兼容性问题。如果您能够深入了解带有 USB 端口的 Android 智能手机,并在智能手机浏览器中修改 javascript,您可能会发现更多有趣的问题。
至于旧版游戏杆(例如我使用了 10 年的 Microsoft Sidewinder Pro USB),它们有自己的乐趣可言。我目前正在努力使其他合理的代码与其中的怪异一起工作,例如分配给 GamePad 对象中的轴属性,等待它,帽子开关,在这个设备上是数字数据源,而不是模拟一。当您坚持使用 GamePad API 时,请注意,在 W3C 最终确定标准之前,兼容性问题正在向您袭来。
【讨论】:
以上是关于游戏手柄 API“gamepadconnected”不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何检测使用 USB HID API 推送的游戏手柄触发器?
OsX 中 USB HID API 的回调永远不会被游戏手柄或其他任何东西调用