Подтвердить что ты не робот

Является ли API-интерфейс Game5 API только для 4 контроллеров?

Я правильно могу получить входные данные от 4 контроллеров, используя API-интерфейс HTML5 Gamepad в браузере.

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

У меня возникают проблемы с входом от 8 контроллеров. Это все контроллеры Xbox 360, я знаю, что существует устаревший предел для XInput API. Но, смотря на вышеперечисленную документацию по HTML5, я не вижу ничего упоминающего о пределе или о том, как реализован API.

navigator.getGamepads(); похоже, возвращает массив из 4 undefined пятен в Chrome и Edge и неопределенный массив в FireFox, который все еще, кажется, подходит к пределу 4.

Вы можете видеть, что Windows 10 проверяет, что у меня есть 8 контроллеров, подключенных на панели "Устройства", и все работают индивидуально до 4 геймпадов в браузере. Поэтому я задаюсь вопросом, почему API-интерфейс Gamepad ограничивает меня здесь - это дизайн API Gamepad или XInput?

8 Подключенные контроллеры

4b9b3361

Ответ 1

Хорошо, я провел несколько обширных исследований и тестирования и почувствовал некоторую уверенность в том, что вы ответите на это.

Спецификация API Gamepad не определяет ограничение для контроллеров, как вы можете видеть в связанной документации выше.

На практике navigator.getGamepads() возвращает:

  • В Chrome, GamepadList из 4 undefined значений, заполненных 4 Gamepad объектов.
  • В Edge массив объектов из 4 undefined, заполненный 4 Gamepad объектов.
  • В FireFox массив с нулевой длиной, заполненный любым количеством объектов Gamepad.

XInput, по-видимому, не является виновником другого, чем может повлиять на реализацию, потому что в FireFox я смог собрать входы вне четырех, которые не были распознаны в других браузерах.

Я думаю, что это может быть доведено до плохой реализации со стороны двигателей за Chrome и Edge, и я могу только надеяться, что они увидят свет, и FireFox сохраняет гибкость в их реализации. В идеале стандарт гласит закон недвусмысленно.

Ответ 2

До сих пор, каждый раз, когда я использовал GamePad API в Chrome, он сначала возвращал массив, содержащий четыре записи. "О программе: Справка" для моей версии возвращает следующую информацию:

Версия 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, чтобы эта информация отправлялась мошенникам. Однако на практике я обнаружил, что это не работает на моем компьютере. Даже после нажатия кнопки несколько раз, мой код выдает диалоговое окно, которое я закодировал, чтобы сказать "Нет игровых приставок". Затем я отключаю диалог, нажимаю кнопку на джойстике, повторю попытку, и, прежде всего, код обнаружения регистрирует мои устройства. Является ли это причудой Chrome или реплицируется в Firefox, я еще не тестировал.

Мне пришла в голову мысль: при тестировании кода браузера попробуйте нажать кнопку на КАЖДОМ подключенном устройстве и посмотреть, приведет ли это к тому, что GamePad API зарегистрирует все ваши устройства. Хотя одна проблема, которую я могу предвидеть, может осложнить ваш тест, заключается в том, что у вас есть несколько идентичных устройств. Если вы можете найти коллекцию из 8 разных геймпадов и попробовать это, вы можете увидеть разные результаты.

В настоящее время существует ряд проблем с API GamePad, поскольку стандарт W3C для этого API еще не завершен - он все еще находится на стадии проекта. Как следствие, разные браузеры имеют разные детали реализации, пока их разработчики не будут иметь стабильный стандарт для работы.