1

我正在使用 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++

4

1 回答 1

0

您如何保存每帧的先前键状态和当前键状态?通过这种方式,您可以测试之前的键状态是否为 KEY UP,而新的键状态是否为 KEY DOWN。这表明该键已被按下。您可以将其用于“按键”功能 - 只需测试之前的按键状态是否为 KEY DOWN 并且新的按键状态也是 KEY DOWN。“key up”函数将测试先前的键状态是否为 KEY DOWN,而新的键状态是否为 KEY UP。

于 2013-07-18T01:41:42.870 回答