有没有办法检查过剩密钥缓冲区?

时间:2012-04-01 17:20:41

标签: c++ input glut

使用解决方案进行编辑

所以我在opengl中制作一个粒子系统。我在Linux工作。我想让它更具互动性,例如,当用户按下空格键时,一个新的烟花射出。

我正在使用GLUT捕捉键盘输入,当用户点击空格键时,它会射出烟花,然后进入一个循环,循环一段时间,如果我再次按空格键,则必须等到循环(如上所述)在注册keypress之前完成执行。

所以我的问题是:

在循环开始时,有没有办法检查过滤器存储过多的缓冲区?我觉得必须有某种缓冲区来存储按键,因为是的,一旦上面的循环完成执行,就会注册按键。

SOLUTION:

我现在实际上并没有在任何地方做任何循环(除了循环遍历数组以更新我的烟花的位置等),我做了类似的事情

在main中,添加:

int main(int argc, char** argv){

    //Usual glut initializations
    glutTimerFunc(30, update, -1);//says in 30miliseconds call update
    glutDisplayFunc(display);   
    glutMainLoop();

    return 0;   
}

然后在你的更新函数中(在glutTimerFunc的参数中,如下所示:

void update(int k){

    //UPDATE POSITION OF FIREWORKS
    glutTimerFunc(30, update, -1);//it is important to add this
    glutPostRedisplay();//calls display() on the next iteration of glut's main loop
}

然后最后在你的显示功能中,做你需要做的事情来绘制一个框架(在我的情况下,循环遍历每个烟花并绘制它!)

希望这会有所帮助:)

1 个答案:

答案 0 :(得分:2)

你这是错误的做法。

你的按键处理程序应该循环任何东西。你的按键处理程序应该只设置一些变量并返回。

您的主显示功能(应由调用glutPostRedisplay的定时器功能驱动)应检查此变量。如果它被设置,那么它应该点燃你的烟火并循环一段时间。

在此期间,您的按键操作员应该忽略任何进一步按空格键的操作。一旦显示功能完成烟花,它就可以响应进一步的按键操作。