Прием ввода с клавиатуры с помощью Glut

Я использую 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 напрямую переводило пользователя в главное меню, потому что пользователь не отпускал клавишу выхода на этом такте основного цикла.

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

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


person Draksis    schedule 09.07.2011    source источник
comment
Лучший способ — использовать что-то (почти что угодно), кроме GLUT. GLUT отлично подходит для быстрой демонстрации того, что делает эта функция OpenGL, но для гораздо большего, чем это, лучше избегать, по крайней мере, IMO.   -  person Jerry Coffin    schedule 10.07.2011
comment
Я изучал возможность использования PLIB бок о бок с GLUT. Это кажется лучшей идеей?   -  person Draksis    schedule 10.07.2011
comment
Я не пробовал, но моя немедленная реакция заключается в том, что если это все еще связано с GLUT, это, вероятно, все еще довольно плохая идея. Возможно, вы захотите рассмотреть некоторые альтернативы GLUT, такие как несколько, которые я разместил в предыдущий ответ.   -  person Jerry Coffin    schedule 10.07.2011
comment
Я начал изучать GLFW и, кажется, понимаю его намного лучше, чем GLUT. Спасибо за вашу помощь!   -  person Draksis    schedule 10.07.2011


Ответы (1)


Как насчет сохранения предыдущего состояния ключа и текущего состояния ключа для каждого кадра? Таким образом, вы можете проверить, было ли предыдущее состояние клавиши KEY UP, а новое состояние клавиши — KEY DOWN. Это указывает на то, что клавиша была нажата. Вы можете принять это для функции «нажатие клавиши» — просто проверьте, было ли предыдущее состояние клавиши KEY DOWN, а новое состояние клавиши также является KEY DOWN. Функция «клавиша вверх» будет проверять, было ли предыдущее состояние клавиши «КЛАВИША ВНИЗ», а новое состояние клавиши — «КЛАВИША ВВЕРХ».

person Phil    schedule 18.07.2013