我正在尝试在 Visual Studio 中用 C++ 编写一个程序,以测试 XBOX 控制器的一些功能。我正在使用 xinput ,因此可以注册控制器是否连接到我的计算机,但是,我可以弄清楚如何判断是否按下了按钮。到目前为止,我有这个作为检查按钮功能
if (state.Gamepad.wButtons == XINPUT_GAMEPAD_A) {
cout << "A\n";
}
现在我只希望它打印出'A'但它不起作用,还有什么我需要添加的吗?
如果您熟悉创建对象类和使用它们并且基于我必须为 Uni 完成的作业,那么此信息会很有帮助。
首先,您可能希望首先创建一个类来存储您连接的每个单独控制器的数据。
class xboxController {
private:
public:
};
现在您可以从某个地方开始,但仍然无法添加多个控制器?如果您想在一个控制器上做某事而在另一个控制器上做其他事情怎么办?您可以创建一个重载的构造函数,您可以手动为控制器分配一个索引。(提示:您需要一些东西来存储它以供进一步使用)(提示2:索引从 0 开始)。
class xboxController {
private:
public:
//Default constructor
xboxController();
//overloaded constructor
xboxController(int i){...};
};
然后,您需要一个可用于检查该特定控制器的功能,即按下了哪个按钮。在之前的课堂作业中,我使用了一个布尔值,如下所示:
//NOTE, this takes in a parameter defined by you and checks it.
bool checkButtonPress(WORD button){...};
但是您还需要您的类中的一个成员,您可以在其中存储控制器的状态(Xbox 控制器使用 Struct XINPUT_STATE)。
XINPUT_STATE controllerState
现在你有地方存储状态,你可以完成布尔:
bool checkButtonPress(WORD press){
return (controllerState.Gamepad.wButtons & press) != 0;
}
XInput 提供了一个能够接收控制器状态信息的功能。为简单起见,您应该创建一个函数,以便在需要更新/获取控制器状态时调用此函数。
void getState(){
//Understand what these lines are doing, and how to use them for your own needs.
ZeroMemory(&controllerState, sizeof(XINPUT_STATE));
XInputGetState(controllerNumber,&controllerState);
}
因此,在您的主体中,您将能够通过使用重载的构造函数并检索控制器的状态,将控制器分配给索引,以便轻松管理该控制器)。然后,您将能够为每个控制器使用一个对象,并能够向每个控制器发送命令。通过使用 bool,您将能够检查正在按下哪个按钮,并能够告诉控制器或计算机如何处理该输入。
如何使用代码的小片段如下:
//This program will keep checking and print a message when
//A is pressed on the controller and will terminate when you press B
int main() {
xboxController xbox(1);
bool isFinished = false;
while (isFinished == false) {
xbox.getState();
if(xbox.checkButtonPress(XINPUT_GAMEPAD_A)){
cout << "Button A was pressed" endl;
}
else if(xbox.checkButtonPress(XINPUT_GAMEPAD_B)){
cout << "Program will now terminate" << endl;
isFinished = true;
}
}
return 0;
}
此外,如果这是针对 MTRN2500 的,请注意我已经演示并提交了我的代码,这仅用于帮助,请勿复制。谢谢!