Gamepad API: события кнопок не запускаются

У меня есть контроллер Bluetooth, в котором я тестировал все номера кнопок с помощью этого тестера Gamepad: http://html5gamepad.com/, поэтому я почти уверен, что значения кнопок верны. Однако, похоже, ничего не срабатывает, геймпад показан "подключенным", просто не работают события кнопок. Ниже приведен код:

function gameLoop() {
  if (navigator.webkitGetGamepads) {
    var wgp = navigator.webkitGetGamepads()[0];

    if (wgp.buttons[12] == 1 || wgp.buttons[4] == 1) {
      console.log('move');
    }
};

gameLoop();

Где я могу ошибаться? Я использую Chrome, поэтому у меня есть префикс webkit. Может ли тестер геймпада показывать мне не те кнопки? Спасибо за вашу помощь.

1 ответ

Решение

Была похожая проблема. Проверка кода в gamepad.js/all.js.cofee показала, что нам нужно извлечь геймпады из navigator на каждом цикле обновления (они не обновляются автоматически), убедитесь, что gameLoop() вызывается неоднократно. Например в window.setInterval(gameLoop, 100) или же window.requestAnimationFrame(gameLoop)

Ссылка:

import * as React from 'react';

interface SampleComponentState {}
class SampleComponent extends React.Component<React.CSSProperties, SampleComponentState>{

    private gamepadUpdateToken: number | null
    constructor(props?: React.CSSProperties){
        super(props)
    }

    private handleGamepad() {
        const gamepads: Gamepad[] = navigator.getGamepads ? 
            navigator.getGamepads() : 
            ((navigator as any).webkitGetGamepads ? (navigator as any).webkitGetGamepads() : [])
        if (gamepads.length == 0){ return }

        gamepads[0].buttons.forEach((button, index) => {
            if (button.pressed){
                console.log(`Pressed button ${index}`)
            }
        })

        gamepads[0].axes.forEach((axe, index) => {
            if (axe != 0){
                console.log(`Axe ${index} moved: ${axe}`)
            }
        })
    }

    componentDidMount(){
        this.gamepadUpdateToken = window.setInterval(this.handleGamepad, 100)
        window.addEventListener("gamepadconnected", (event: any) => {
            const newGamapad: Gamepad = event.gamepad
            console.log(newGamapad)
        })
    }

    componentWillUnmount() {
        window.removeEventListener("gamepadconnected")
        if (this.gamepadUpdateToken != null){
            window.clearInterval(this.gamepadUpdateToken)
        }
    }

    render(){
        return (
            <div>
            </div>
        )
    }
}
Другие вопросы по тегам