Кнопка Xbox нажата в переполнении стека

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

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

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

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:

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, учтите, что я продемонстрировал и отправил свой код, и это только для справки, а не для копирования. Спасибо!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]