用Glut接受键盘输入

时间:2011-07-09 19:04:57

标签: c++ keyboard user-input glut freeglut

我正在使用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获取(和使用)键盘输入的最佳方法是什么?

编辑:顺便说一下,这是C ++

1 个答案:

答案 0 :(得分:0)

如何保存每个帧的先前键状态和当前键状态?这样,您可以测试先前的键状态是否为KEY UP且新键状态是KEY DOWN。这表示已按下该键。您可以将此用于“按下键”功能 - 只需测试以查看先前的键状态是否为KEY DOWN,新键状态是否也是KEY DOWN。 “key up”函数将测试前一个键状态是否为KEY DOWN且新键状态是KEY UP。