Принятие ввода с клавиатуры с избытком - PullRequest
1 голос
/ 09 июля 2011

Я использую Freeglut для разработки некоторых основных игр. Однако у меня были некоторые проблемы с вводом с клавиатуры.

В некоторых предыдущих играх, которые я делал, я делал что-то вроде этого: (псевдокод)

class Key {

bool pressed;
void press() {pressed = true;}
void release() {pressed = false;}
bool isPressed() {return pressed;}

}

Key wkey, skey;

handleKeypress(unsigned char key, int xf, int yf) { //This is the function that glutKeyBoardFunc gets
    switch(key) {
    case 'w':
        wkey.press();
    case 's':
        skey.press();
    }
}

handleKeypress(unsigned char key, int xf, int yf) { //This is the function that glutKeyBoardUpFunc gets
    switch(key) {
    case 'w':
        wkey.release();
    case 's':
        skey.release();
    }
}

Когда я хотел проверить, нажата ли клавиша или нет, я проверил wkey.isPressed(). Однако это вызвало проблемы. Например, клавиша Esc должна была ставить игру на паузу, а затем нажатие клавиши Esc на экране паузы должно было привести пользователя в главное меню. Тем не менее, нажатие клавиши Esc сразу привело пользователя в главное меню, поскольку пользователь не отпускал клавишу escape в этом тике основного цикла.

Чтобы избежать подобных проблем, как лучше всего использовать (и использовать) ввод с клавиатуры с помощью Freeglut?

РЕДАКТИРОВАТЬ: Кстати, это C ++

1 Ответ

0 голосов
/ 18 июля 2013

Как насчет сохранения предыдущего состояния ключа и текущего состояния ключа для каждого кадра? Таким образом, вы можете проверить, было ли предыдущее состояние ключа KEY UP, а новое состояние ключа - KEY DOWN. Это указывает на то, что клавиша была нажата. Вы можете принять это для функции «нажатой клавиши» - просто проверьте, было ли предыдущее состояние клавиши KEY DOWN, а новое состояние клавиши также KEY DOWN. Функция key up проверяет, было ли предыдущее состояние ключа KEY DOWN, а новое состояние ключа - KEY UP.

...