2016-08-10 3 views
0

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

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

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

+0

Возможно, вы захотите опубликовать [еще какой-нибудь код] (http://sscce.org). – zneak

+0

Я предполагаю, что wButtons - это бит для всех кнопок, поэтому вы можете протестировать один бит. if (... wButtons & XINPUT_GAMEPAD_A) {...} – PaulHK

+0

Трудно предложить решения, когда утверждение проблемы просто «не работает». Пожалуйста, отредактируйте свой вопрос, чтобы дать более полное описание того, что вы ожидали, и как это отличается от фактических результатов. См. [Ask] для подсказок о том, что дает хорошее объяснение. –

ответ

0

Эта информация полезна, если вы знакомы с созданием классов объектов и их использованием и основаны на задании, которое мне пришлось выполнить для Uni.

Сначала вы можете начать с создания класса для хранения данных для каждого отдельного контроллера, который вы подключаете.

class xboxController { 
private: 

public: 
}; 

Теперь у вас есть где начать, но все еще не удается добавить несколько контроллеров? Что делать, если вы хотите что-то сделать на одном контроллере и что-то еще на другом? Вы можете создать перегруженный конструктор, который вы могли бы вручную присвоить индексу для контроллера. (СОВЕТ: вам понадобится что-то, чтобы сохранить его для дальнейшего использования) (HINT2: начало индекса в 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:

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, пожалуйста, знайте, что я показал и представил свой код, и это только за помощью, и не копироваться. Благодаря!