目前市面上的游戲外設,要么支持傳統的DirectInput接口,要么支持最新的XInput技術。今天在這里聊一聊,如何通過XInput技術實現對這類游戲外設相關信息的捕獲。關於DirectInput與XInput間的區別,可以參考
XInput和DirectInput文章。
相較於DirectInput來說,XInput在針對游戲外設編程時就簡單明了很多,不需要太多繁瑣的代碼就可以輕松獲得游戲外設的狀態。
首先,在應用程序頭文件中添加以下信息,代碼如下:
#include <XInput.h> #include "afxwin.h" #pragma comment(lib, "XInput.lib")
在應用程序類當中,定義一個手柄狀態量,代碼如下:
public: XINPUT_STATE m_ControllerState;
通過XInputGetState函數來獲取支持XInput接口的游戲外設信息,同時通過該函數的返回值信息來判斷當前是否有支持XInput接口的游戲設備接入當前操作系統。
ZeroMemory(&m_ControllerState, sizeof(XINPUT_STATE)); if(XInputGetState(0, &m_ControllerState) != ERROR_SUCCESS) { MessageBox(_T("No Controller Connected!")); }
在一個定時器或者線程里面,可以通過判定XINPUT_STATE相關成員的值來識別相關按鍵是否被按下,代碼如下:
XINPUT_GAMEPAD gamepad; CString temp; while(XInputGetState(0, &(m_ControllerState)) == ERROR_SUCCESS) { gamepad = m_ControllerState.Gamepad; // gamepad.sThumbLX // gamepad.sThumbLY // gamepad.bLeftTrigger // gamepad.bRightTrigger // gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP // gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN // gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT // gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT // gamepad.wButtons & XINPUT_GAMEPAD_START // gamepad.wButtons & XINPUT_GAMEPAD_BACK // gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER // gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER // gamepad.wButtons & XINPUT_GAMEPAD_A // gamepad.wButtons & XINPUT_GAMEPAD_B // gamepad.wButtons & XINPUT_GAMEPAD_X // gamepad.wButtons & XINPUT_GAMEPAD_Y }
至此,所有XInput針對游戲外設的編程關鍵點已經水落石出。