【问题标题】:Accepting Keyboard Input with Glut使用 Glut 接受键盘输入
【发布时间】:2011-07-09 19:04:57
【问题描述】:

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

【问题讨论】:

  • 最好的方法是使用 GLUT 以外的东西(几乎任何东西)。 GLUT 可以快速演示“这就是这个 OpenGL 函数的作用”,但除此之外,最好避免使用它,至少在 IMO 中是这样。
  • 我一直在研究将 PLIB 与 GLUT 并排使用。这似乎是一个更好的主意吗?
  • 我没有尝试过,但我的第一反应是,如果它仍然涉及 GLUT,它可能仍然是一个非常糟糕的主意。您可能需要考虑一些 GLUT 的替代品,例如我在 previous answer 中发布的一些。
  • 我已经开始关注 GLFW,我似乎比 GLUT 更了解它。感谢您的帮助!

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多