Нажатие джойстика програмно javascript

Рейтинг: 1Ответов: 1Опубликовано: 22.07.2023

В js можно програмно кликнуть. Например document.onclick() Можно ли тоже самое сделать с кнопками джойстика?

Ответы

▲ 0

Согласно информации, представленной на страницах MDN Web Docs (Использование Gamepad API и GamepadButton), специальных события нажатия кнопки джойстика и обработчика такого события не существует, в отличие от, например, MouseEvent, а для определения состояния кнопок контроллера используют регулярный их опрос:

function gameLoop() {
  const gp = navigator.getGamepads()[0];

  if (gp.buttons[0].value > 0 || gp.buttons[0].pressed) {
    b--;
  } else if (gp.buttons[1].value > 0 || gp.buttons[1].pressed) {
    a++;
  } else if (gp.buttons[2].value > 0 || gp.buttons[2].pressed) {
    b++;
  } else if (gp.buttons[3].value > 0 || gp.buttons[3].pressed) {
    a--;
  }

  ball.style.left = `${a * 2}px`; // ball is a UI widget
  ball.style.top = `${b * 2}px`;

  requestAnimationFrame(gameLoop);
}

Пример взят со страницы GamepadButton#example.

Как видно из приведённого примера, для имитации событий ввода с помощью джойстика нужно добавить в обработчик альтернативное (программное) состояние. Пример:

// Виртуальные кнопки джойстика
var gamepadVirtualButtons = new Array(4).fill().map(e => new Object({value: 0, pressed: false}));

// Обработчик событий ввода с помощью джойстика
function gameLoop() {
  const gp = navigator.getGamepads()[0];

  // К источникам событий ввода добавлены виртуальные кнопки
  var buttonSources = [gp.buttons, gamepadVirtualButtons];
  for (let i = 0; i < 4; i++) {
    if (!buttonSources.reduce((acc, cur) => acc || (cur[i].value > 0 || cur[i].pressed), false)) continue;
    switch (i) {
      case 0:
        button0Pressed();
        break;
      case 1:
        button1Pressed();
        break;
      case 2:
        button2Pressed();
        break;
      case 3:
        button3Pressed();
        break;
    }
  }

  requestAnimationFrame(gameLoop);
}

// Имитация нажатия
function startGamepadButtonPressed(buttonPos) {
  gamepadVirtualButtons[i].pressed = true;
}
// Завершение нажатия
function endGamepadButtonPressed(buttonPos) {
  gamepadVirtualButtons[i].pressed = false;
}