21

通过在浏览器中使用 HTML5 Gamepad API,我能够正确地从 4 个控制器获取输入。

https://www.w3.org/TR/gamepad/

我遇到的问题是从 8 个控制器获取输入。这些都是 Xbox 360 控制器,我知道 XInput API 存在遗留限制。但是查看上面的 HTML5 API 文档,我看不到任何提及限制或 API 是如何实现的内容。

navigator.getGamepads();似乎在 Chrome 和 Edge 中返回了一个包含 4 个未定义点的数组,而在 FireFox 中返回了一个似乎仍然达到 4 个限制的未指定数组。

您可以看到 Windows 10 验证我在“设备”面板中连接了 8 个控制器,并且所有控制器都可以在浏览器中单独使用最多 4 个游戏手柄。所以我质疑为什么 Gamepad API 在这里限制了我——是 Gamepad API 还是 XInput 的设计?

已连接 8 个控制器

4

4 回答 4

13

好的,我已经进行了一些广泛的研究和测试,并且对回答这个问题感到有些信心。

如您在上面的链接文档中所见,Gamepad API 规范没有定义对控制器的限制。

在实践中,navigator.getGamepads()返回:

  • 在 Chrome 中,一个GamepadList4 个未定义的值,用 4 个Gamepad对象填充。
  • 在(旧版)Edge 中,一个包含 4 个未定义值的对象数组,其中填充了 4 个Gamepad对象。
  • 在 Firefox 中,一个长度为零的数组,填充任意数量的Gamepad对象。

除了可能影响实现之外,XInput 似乎并不是罪魁祸首,因为我能够在 Firefox 中混合超过四个的输入,而这些输入在其他浏览器中都无法识别。

我认为这可以归结为 Chrome 和 Edge 背后的引擎的不良实施,我只能希望他们看到光明,而 Firefox 保持他们的实施灵活。理想情况下,该标准明确规定了法律。

于 2016-12-21T02:36:24.010 回答
1

到目前为止,每次我在 Chrome 中使用 GamePad API 时,它都会返回一个最初包含四个条目的数组。我的版本的“关于:帮助”返回以下信息:

版本 59.0.3071.115(官方版本)(64 位)

运行我的代码时,将一个输入设备连接到我的计算机,该数组包含以下条目:

  • array[0] : 我连接的设备的 GamePad 对象;
  • 数组[1]:空;
  • 数组[2]:空;
  • 数组[3]:空;

目前我没有足够的备用 USB 端口来尝试插入超过 3 个设备,所以如果有人确实有必要的硬件慷慨,这将是一个有趣的实验来找出如果你将 5 个游戏手柄连接到你的计算机会发生什么,看看 Chrome 是否为他们创建了一个足够大的数组。

我发现的另一个怪癖是这个。在运行任何调用 navigator.getGamePads() 方法的代码之前,您应该按下一个游戏手柄/操纵杆上的按钮。这是一项安全功能,可阻止网页侦听您的游戏手柄详细信息,并将其发送给恶意实体 - 如果您有幸在一个真实的 F-16 HOTAS 装置上砸了几千英镑,您就不会’不希望将此信息发送给诈骗者。但是,在实践中,我发现这在我的计算机上不起作用。即使按了几次按钮,我的代码也会弹出我编写的对话框,说“未检测到游戏手柄”。然后我关闭对话,按下操纵杆上的按钮,再试一次,嘿,检测代码注册了我的设备。无论这是 Chrome 的怪癖,

我突然想到:在测试您的浏览器代码时,尝试在每个连接的设备上按下一个按钮,看看这是否会导致 GamePad API 注册您的所有设备。尽管我可以预见到一个可能会使您的测试复杂化的问题是您连接了多个相同的设备。如果您能找到 8种不同游戏手柄的集合并尝试一下,您可能会看到不同的结果。

GamePad API 目前存在一系列问题,因为该 API 的 W3C 标准尚未最终确定 - 它仍处于草案阶段。因此,不同的浏览器有不同的实现细节,直到开发者有一个稳定的标准可以使用。

于 2017-08-01T06:02:17.347 回答
1

我发现如果我插入多个控制器,然后拔掉一些索引较低的控制器,即使刷新后,chrome 编号也会保持不变,而 mozilla 编号只会保持到刷新。这让我觉得 chrome 实际上是从 Windows 获取数据(因此长度为 4),而 mozilla 是自己完成的。

于 2018-07-06T18:25:13.090 回答
0

如果实现在内部使用 xinput API,则限制为 4,如果他们能够识别除 xinput 之外的 Hid,理论上他们可以通过 w3c API 按摩和暴露更多信息,但它可能会变得复杂且容易出错,尤其是在多个设备进入和退出..

于 2018-04-27T06:36:03.067 回答