Как обнаружить нажатие кнопки с помощью Gamepad API? - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь написать веб-страницу, где я могу обнаружить нажатия кнопок на контроллере Xbox и показать пользователю логическое значение на основе нажатой кнопки. Прямо сейчас я могу обнаружить подключенный контроллер и показать его в виде строки. Документация говорит, что использовать этот код для обнаружения нажатия кнопки здесь:

var isPressed = navigator.getGamepads()[0].pressed;

, но Chrome показывает эту ошибку при использовании:

Uncaught TypeError: Cannot read property 'pressed' of null

Ошибка связана с .pressed часть вышеуказанной строки кода. Вся документация находится на сайте Mozilla , поэтому я предполагаю, что они использовали FireFox при написании руководств.

В идеале я хотел бы получить следующее:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<h id="button"></h>
<h id="gpInfo"></h>
<script>
var i = 1; 
window.addEventListener("gamepadconnected", function(e) {
  var gp = navigator.getGamepads()[e.gamepad.index];
  document.getElementById("gpInfo").innerHTML = ("A " + gp.id + " was successfully detected! There are a total of " + gp.buttons.length + " buttons.")
  //alert("A " + gp.id + " was successfully detected!")
});
var isPressed = navigator.getGamepads()[0].pressed;
document.getElementById("button").innerHTML = isPressed;
</script>
<!-- <script type="text/javascript" src="gamepadtest.js"></script> -->
</head>
</html>

Код выведет на экран логическое значение, чтобы пользователи могли видеть, когда они нажимают кнопку. Я впервые работаю с JavaScript и HTML. Если бы вы могли сделать свой ответ дружелюбным к новичкам, это было бы здорово! Документация для Gamepad API и для GamepadButton

1 Ответ

1 голос
/ 23 марта 2020

Вы не должны ссылаться на объект Gamepad, пока не будет сгенерировано событие gamepadconnected. Также вам понадобится al oop для опроса значения кнопки. Вот некоторый пересмотренный код:

var i = 1; 
window.addEventListener("gamepadconnected", function(e) {
  var gp = navigator.getGamepads()[e.gamepad.index];
  document.getElementById("gpInfo").innerHTML = ("A " + gp.id + " was successfully detected! There are a total of " + gp.buttons.length + " buttons.")
  //alert("A " + gp.id + " was successfully detected!")

  setInterval(function(){
    isPressed = gp.buttons[0].pressed;
    document.getElementById("button").innerHTML = isPressed;
  }, 100)
});
...