Нажатие джойстика програмно javascript
В js можно програмно кликнуть. Например document.onclick() Можно ли тоже самое сделать с кнопками джойстика?
Источник: Stack Overflow на русском
В js можно програмно кликнуть. Например document.onclick() Можно ли тоже самое сделать с кнопками джойстика?
Согласно информации, представленной на страницах 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;
}