2018年5月7日 星期一

XInput的使用

XInput的使用

前言

  最近需要偵測XBox的手把,所以就研究了一下XInput,在此做個紀錄。

內容

  XInput用起來相當簡單,首先先看以下的程式碼

DWORD dwResult;    
for (DWORD i=0; i< XUSER_MAX_COUNT; i++ )
{
  XINPUT_STATE state;
  ZeroMemory( &state, sizeof(XINPUT_STATE) );

        // Simply get the state of the controller from XInput.
        dwResult = XInputGetState( i, &state );

        if( dwResult == ERROR_SUCCESS )
  {
      // Controller is connected 
  }
        else
  {
            // Controller is not connected 
  }
}

  可以看到一個"XUSER_MAX_COUNT",這個Marco會定義最多可以用的手把數量,接著透過XInputGetState()來偵測目前的輸入,第1個參數就是指第幾隻手把,而第二個參數是一個"XINPUT_STATE",裡面會儲存所有的輸入資訊。
  "XINPUT_STATE"裡的"XINPUT_GAMEPAD"會儲存手把的按鍵資訊,以下示範取得按鍵的範例

  XINPUT_STATE state;
  if(state.Gamepad.wButtons&XINPUT_GAMEPAD_DPAD_LEFT)
  {
    //Left button was pressed...
  }

接著是取得類比輸入的範例

  XINPUT_STATE state;
  float leftThumbX = fminf(1.0f,( (float)state.Gamepad.sThumbLX) / 32767);
  float leftThumbY = fminf(1.0f,( (float)state.Gamepad.sThumbLY) / 32767);

這樣就可以得到類比輸入的X與Y值,但要注意的是當類比歸位的時候(就是不動的時候),類比的數值並回會剛好是0.0f,他會有一個微小的誤差,這範圍大概設在-0.1f~0.1f,要記得過濾掉。


參考資料

XInput Game Controller APIs
XINPUT_GAMEPAD structure

沒有留言:

張貼留言