在C ++中按下Xbox按钮

时间:2016-08-10 02:44:47

标签: c++ xbox xinput

我正在尝试用Visual Studio中的C ++编写程序,以测试XBOX控制器的一些功能。我正在使用xinput,因此如果控制器连接到我的计算机可以注册,但是,我可以弄清楚如何判断按钮是否被按下。到目前为止,我将其作为检查按钮功能

if (state.Gamepad.wButtons == XINPUT_GAMEPAD_A) {
   cout << "A\n";
}

现在我只想打印出'A'但它不起作用,还有什么我需要添加的吗?

1 个答案:

答案 0 :(得分:0)

如果您熟悉创建对象类并使用它们并且基于我必须为Uni完成的任务,这些信息会很有用。

首先,您可能需要创建一个类来存储您连接的每个控制器的数据。

class xboxController {
private:

public:
};

现在你有一个地方可以开始,但仍然无法添加多个控制器?如果你想在一个控制器上做某事而在另一个控制器上做些什么怎么办?您可以创建一个重载的构造函数,您可以手动为控制器分配一个索引。(提示:您需要一些东西来存储它以供进一步使用)(HINT2:索引从0开始)。

class xboxController {
private:

public:
   //Default constructor
   xboxController();
   //overloaded constructor
   xboxController(int i){...};
};

然后你想要一个可以用来检查特定控制器的功能,按下了什么按钮。在之前的课程作业中,我使用了一个bool,如下所示:

//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的,请注意我已经演示并提交了我的代码,这仅用于帮助,不能复制。谢谢!