2017-06-25 91 views
1

我有一個藍牙控制器,我用這個遊戲手柄測試儀測試了所有按鍵的數字:http://html5gamepad.com/,所以我很肯定按鍵的值是正確的。然而,似乎沒有任何事情發生,遊戲手柄顯示爲「連接」,只是按鈕事件不起作用。以下是代碼:遊戲手柄API:按鍵事件沒有觸發

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