Кнопка Xbox нажата в C++

Я пытаюсь написать программу на С++ в Visual Studio, чтобы проверить некоторые функции контроллера XBOX. Я использую xinput, поэтому for может зарегистрироваться, если контроллер подключен к моему компьютеру, однако я могу понять, как узнать, была ли нажата кнопка. Пока у меня есть это как функция кнопки проверки

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

прямо сейчас я хочу, чтобы он распечатывал только «А», но он не работает, есть ли что-нибудь еще, что мне нужно добавить?


person Jonski Goldstein    schedule 10.08.2016    source источник
comment
Вы можете опубликовать дополнительный код.   -  person zneak    schedule 10.08.2016
comment
Я предполагаю, что wButtons - это битовое поле для всех кнопок, поэтому вы можете проверить один бит. if(...wButtons & XINPUT_GAMEPAD_A) { ... }   -  person PaulHK    schedule 10.08.2016
comment
Трудно предлагать решения, когда формулировка проблемы проста: она не работает. Пожалуйста, отредактируйте свой вопрос, чтобы дать более полное описание того, что вы ожидали, и чем это отличается от фактических результатов. См. раздел Как спросить, чтобы узнать, что является хорошим объяснением.   -  person Toby Speight    schedule 10.08.2016


Ответы (1)


Эта информация будет полезна, если вы знакомы с созданием классов объектов и их использованием, а также на основании задания, которое я должен был выполнить для 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, имейте в виду, что я продемонстрировал и отправил свой код, и это только для помощи, а не для копирования. Спасибо!

person Craqattack    schedule 17.08.2016