2017-06-25 3 views
1

Ich habe einen Bluetooth-Controller, in dem ich alle Nummern der Tasten mit diesem Gamepad Tester getestet habe: http://html5gamepad.com/, also bin ich ziemlich sicher, dass die Werte der Tasten korrekt sind. Nichts scheint jedoch zu feuern, das Gamepad wird als "verbunden" angezeigt, nur die Tastenereignisse funktionieren nicht. Unten ist der Code:Gamepad API: Knopf Ereignisse nicht feuern

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

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

gameLoop(); 

Wo könnte ich falsch liegen? Ich verwende Chrome, daher habe ich das Webkit-Präfix. Könnte der Gamepad-Tester mir die falschen Tasten zeigen? Danke für Ihre Hilfe.

Antwort

1

Hatte ähnliches Problem. Überprüfung des Codes unter gamepad.js/all.js.cofee hervorgehoben, dass wir Gamepads von navigator bei jedem Update-Zyklus abrufen müssen (sie nicht automatisch aktualisieren), stellen Sie sicher, dass Ihre gameLoop() wiederholt aufgerufen wird. Zum Beispiel in window.setInterval(gameLoop, 100) oder window.requestAnimationFrame(gameLoop)

Referenz:

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> 
     ) 
    } 
}