【发布时间】:2014-08-12 08:44:42
【问题描述】:
我目前正在编写一些 C++ 代码来检测游戏手柄按钮的按下情况。我正在使用以下代码来定义一组可能的按钮按下:
#include <windows.h>
#include <mmsystem.h>
this->buttons[0] = JOY_BUTTON1;
this->buttons[1] = JOY_BUTTON2;
...
this->buttons[31] = JOY_BUTTON32;
然后使用类似下面的东西来检测按下了哪个按钮:
joyGetPosEx(this->joyStickId, &info);
buttonPressed = false;
for(int i=0; i<32; i++){
if((info.dwButtons & this->buttons[i]) == this->buttons[i]){
buttonPressed = true;
cout << "button number " << (i+1) << "was pressed!" << endl;
}
}
if(buttonPressed === false){
cout << "could not detect button press, dwButtons was set to: " << info.dwButtons << endl;
}
这适用于游戏手柄按钮 1-4。但是,按钮 5-32 不起作用。例如,当按下游戏手柄上的按钮 5 时,程序认为 dwButtons 设置为 16。mmsystem.h 中定义的 JOY_BUTTON5 是 257。所以在我看来, JOY_BUTTON5 - 32 在 mmsystem 中定义不正确。是这样吗,还是我错过了什么?
【问题讨论】:
-
你用的是什么类型的操纵杆?使用此函数查询 xbox 360 样式(ms 制造)控制器会返回大部分无用信息。例如,左触发器和右触发器“按钮”都改变了
dwZPos的值。按下 LT 会增加数值,而按下 RT 会减少数值。因此,两个完全按下时在 dwZPos 中返回的值与如果 两者都没有 被按下时返回的值相同。 (32768)。这是使用 XInput 处理特定控制器的示例 - codeproject.com/Articles/26949/… -
感谢您的评论 - 这是一个基于此的定制“游戏手柄”:u-hid.com/home/overview_board.php。我已经用另一个类似的设备尝试过,dwButtons 也不匹配超过 5 的 JOY_BUTTONx 常量。
-
嗯,很有趣。 :) 我应该提到,除了触发器“按钮”之外,普通按钮在
dwButtons中返回的值是 1、2、4、8、16、32、64 和 128。如果你得到相同的值,这可能是尝试 XInput 示例的一个案例。 mmsystem.h 中的内容自 win2k 以来一直存在 - 我不记得我们当时是否有 HID 硬件,但我怀疑这些内容是为 winxp 提供的。 (很确定 WinXp 给我们带来了 directX,其中 XInput 是其中的一部分) -
@enhzflep 是的,我发现了同样的事情:实际的
dwButtons值似乎每次都翻倍。我想我仍然会使用mmsystem和joyGetPosEx,因为它已经(大部分)工作了,只是不使用JOY_BUTTONx常量。我将硬编码this->buttons数组以包含 1,2,4,8 等。