如何通过XInput技术针对游戏方向盘或者手柄编程

目前市面上的游戏外设,要么支持传统的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针对游戏外设的编程关键点已经水落石出。
作者:常想一二
出处:http://www.cnblogs.com/wolfmvp/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。
原文地址:https://www.cnblogs.com/wolfmvp/p/6908585.html