Прослушивание событий кнопок геймпада с помощью контроллера xbox one

Я хотел бы прослушивать события нажатия кнопок на контроллере xbox one, но кажется, что многие решения для этого являются экспериментальными и находятся в стадии разработки. В большинстве найденных мной примеров, показывающих, как получать ввод с геймпада, используется метод опроса для многократной проверки геймпада на наличие событий, но для моего приложения крайне важно, чтобы я мог записывать точное время нажатия кнопки, а не хотите пропустить нажатия кнопок между сканированием геймпада.

Я могу использовать либо Firefox, либо Chrome, но я еще не получил следующие решения для работы ни в одном из браузеров:

Firefox: согласно этой странице https://www.chromestatus.com/feature/5989275208253440#, «события кнопки геймпада и оси реализованы в Firefox за флагом dom.gamepad.non_standard_events.enabled». Я включил это в Firefox, но прослушиваю события изменения состояния (как описано в https://www.smashingmagazine.com/2015/11/gamepad-api-in-web-games/) по-прежнему не действует.

Chrome: эта страница github https://github.com/MozillaReality/gamepad-plus/blob/master/README.md похоже, что он может расширить API Gamepad, поэтому я также могу прослушивать события нажатия кнопок в Chrome, но когда я пытаюсь скомпилировать JavaScript как автономный модуль, использующий npm run build, я получаю сообщение об ошибке node_modules_missing, и сборка завершается сбоем.

Буду признателен за совет, как включить .addEventListener('gamepadbuttondown'... для работы в любом из этих браузеров.


person c0deBr0    schedule 04.03.2020    source источник


Ответы (1)


Благодаря примеру codepen от Кристофера Ван Вимеерша на https://codepen.io/cvan/pen/aOzgGE Я нашел решение в Firefox.

Сначала я открыл браузер Firefox (версия 73.0.1) и ввел about:config в URL. Затем я переключил dom.gamepad.non_standard_events.enabled на true.

Затем я использовал следующие функции/слушатели из codepen Кристофера:

var gamepadConnected = function (e) {
  console.log('Gamepad connected at index %d: %s. %d buttons, %d axes.',
    e.gamepad.index, e.gamepad.id, e.gamepad.buttons.length, e.gamepad.axes.length);
};

var gamepadDisconnected = function (e) {
  console.log('Gamepad removed at index %d: %s.', e.gamepad.index, e.gamepad.id);
};


var gamepadButtonDown = function (e) {
  console.log('Gamepad button down at index %d: %s. Button: %d.',
    e.gamepad.index, e.gamepad.id, e.button);
};

var gamepadButtonUp = function (e) {
  console.log('Gamepad button up at index %d: %s. Button: %d.',
    e.gamepad.index, e.gamepad.id, e.button);
};
window.addEventListener('gamepadconnected', gamepadConnected);
window.addEventListener('gamepaddisconnected', gamepadDisconnected);

window.addEventListener('gamepadbuttondown', gamepadButtonDown);
window.addEventListener('gamepadbuttonup', gamepadButtonUp);

Затем, когда кнопка нажата, я записываю метку времени, используя var timestamp = new Date().getTime().

person c0deBr0    schedule 04.03.2020