HTML5 Gamepad API仅限于4个控制器吗?

时间:2016-12-20 20:51:54

标签: javascript html html5 gamepad gamepad-api

我能够通过在浏览器中使用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个游戏手柄。所以我在质疑游戏手柄API为何限制我 - 这是游戏手柄API或XInput的设计吗?

8 Controllers Connected

4 个答案:

答案 0 :(得分:6)

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

Gamepad API规范没有定义控制器的限制,您可以在上面的链接文档中看到。

实际上,navigator.getGamepads()会返回:

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

XInput似乎不是可能影响实现的罪魁祸首,因为我能够在Firefox中混合使用超过4的输入,而这些输入在其他浏览器中并未得到认可。

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

答案 1 :(得分:0)

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

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

运行我的代码时,如果一台输入设备连接到我的计算机,则该阵列包含以下条目:

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

目前我没有足够的备用USB端口来尝试插入3个以上的设备,所以如果有人确实拥有必要的硬件,那么如果你附上会发生什么,这将是一个有趣的实验。将5个游戏手柄连接到您的计算机,并查看Chrome是否为他们创建了足够大的阵列。

我发现的另一个怪癖就是这个。在运行任何调用navigator.getGamePads()方法的代码之前,您应该按下其中一个游戏手柄/操纵杆上的按钮。这是一个安全功能,可以阻止网页监听您的游戏手柄细节,并将其发送给恶意实体 - 如果您有幸在现实的F-16 HOTAS设备上吹了几千英镑,那么不希望将这些信息发送给诈骗者。但是,在实践中,我发现这在我的计算机上不起作用。即使多次按下按钮,我的代码也会弹出我编码的对话框,说“&34;没有检测到游戏手柄”#34;。然后我解除对话,按下操纵杆上的按钮,再试一次,然后检测代码注册我的设备。无论这是Chrome的怪癖,还是在Firefox中复制,我还没有测试过。

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

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

答案 2 :(得分:0)

如果实现在内部使用xinput API,那么4是限制,如果除了xinput之外它们能够识别Hid,理论上它们可以通过w3c API进行按摩和暴露,但是它可能会出错并且容易出错,尤其是多个设备进入和退出..

答案 3 :(得分:0)

我发现,如果我插入多个控制器,然后拔下一些索引较低的控制器,即使刷新后chrome编号仍然保持不变,而在mozilla编号上直到刷新才保持不变。这让我觉得chrome实际上是从Windows提取数据的(因此长度为4),而mozilla本身是这样做的。