一、效果展示
直接上效果图:
二、利用XInput实现获取XBox游戏手柄数据
在网上搜寻了很久,发现方法可以对游戏手柄进行测试,但是MFC版本以及完全版的很少有比较完全的资料,因此作为新手的我,正在攻克这方面,写的不足请多包含!
- 首先我实验的版本是如图所示的游戏手柄:
- 开始读取游戏手柄的数据,在.cpp文件中创建一个线程,代码如下:
//读取游戏手柄的线程 UINT _cdecl CMFC_GameHandle2Dlg::ReadJoystickThread(LPVOID lpParm) { CMFC_GameHandle2Dlg *dlg = (CMFC_GameHandle2Dlg*)lpParm; XINPUT_GAMEPAD gamepad; CString temp; //识别游戏手柄是否插入,并读取数据 while (XInputGetState(0,&(dlg->m_ControllerState)) == ERROR_SUCCESS ) { LastLxDataLX = LxDataLX; LastLxDataLY = LxDataLY; LastLxDataRX = LxDataRX; LastLxDataRY = LxDataRY; gamepad = dlg->m_ControllerState.Gamepad; //上下左右按键 (gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) ? (dlg->IsPressed_upT()): (dlg->IsPressed_upF()); (gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) ? (dlg->IsPressed_downT()): (dlg->IsPressed_downF()); (gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)?(dlg->IsPressed_leftT()): (dlg->IsPressed_leftF()); (gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)?(dlg->IsPressed_rightT()): (dlg->IsPressed_rightF()); (gamepad.wButtons & XINPUT_GAMEPAD_START)?(dlg->IsPressed_StartT()):(dlg->IsPressed_StartF()); (gamepad.wButtons & XINPUT_GAMEPAD_BACK)?(dlg->IsPressed_BackT()):(dlg->IsPressed_BackF()); (gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER)?(dlg->IsPressed_RLT()):(dlg->IsPressed_RLF()); (gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER)?(dlg->IsPressed_RRT()):(dlg->IsPressed_RRF()); if(gamepad.wButtons & XINPUT_GAMEPAD_A) { dlg->IsPressed_AT(); } else { dlg->IsPressed_AF(); } (gamepad.wButtons & XINPUT_GAMEPAD_B)?(dlg->IsPressed_BT()):(dlg->IsPressed_BF()); (gamepad.wButtons & XINPUT_GAMEPAD_X)?(dlg->IsPressed_XT()):(dlg->IsPressed_XF()); (gamepad.wButtons & XINPUT_GAMEPAD_Y)?(dlg->IsPressed_YT()):(dlg->IsPressed_YF()); //TZ轴,也是就是游戏手柄最上的两个按钮 { LxDataTZ =(gamepad.bRightTrigger)/1.7-(gamepad.bLeftTrigger)/1.7+360; dlg->DrawGradientColor1(210,LxDataTZ); dlg->ClearDrawGradientColor(510,LxDataTZ); } //摇杆 { { LxDataLX = gamepad.sThumbLX/345 + 150; LxDataLY = (-gamepad.sThumbLY)/345 + 525; //gamepad.sThumbLY:32767 LxDataRX = gamepad.sThumbRX/345 + 400; LxDataRY = (-gamepad.sThumbRY)/345 + 525; if(LxDataRX > 500 && LxDataRY > 625 ) { LxDataRX = 470; LxDataRY = 620; } if(LxDataRX < 0 && LxDataRY < 0) { LxDataRX = 400; LxDataRY = 525; } dlg->ClearSmartEclise(LastLxDataLX ,LastLxDataLY); //150,525 dlg->ClearSmartEclise(LastLxDataRX ,LastLxDataRY); //400,525 dlg->SetSmartEclise(LxDataLX ,LxDataLY ); //75,525 dlg->SetSmartEclise(LxDataRX ,LxDataRY); //400,525 } } } return 0; }
- A、X、Y、B等一些按键我是通过重绘CButton类进行贴图按钮
三、 附带注意事项
1、在.h文件中需要添加一些条件:
#include "resource.h" // 主符号
#include <XInput.h>
#include "afxwin.h"
#pragma comment(lib, "XInput.lib") //添加依赖库
2、因为我这边采取的是直接按照我的页面进行的数值设置,所以一些需要进行数值微型调整!