有没有办法检查过剩键缓冲区?
Posted
技术标签:
【中文标题】有没有办法检查过剩键缓冲区?【英文标题】:Is there a way to check the glut key buffer? 【发布时间】:2012-04-01 17:20:40 【问题描述】:用解决方案编辑
所以我在opengl中制作了一个粒子系统。我在 Linux 中工作。我想让它更具交互性,例如,当用户按下空格键时,会发出新的烟花。
我正在使用 GLUT 来捕获键盘输入,当用户按下空格键时,它会射出一个烟花,然后进入一个循环循环一段时间,如果我再次按下空格键,它必须等到那个循环(上面提到的)在注册按键之前执行完毕。
所以我的问题是:
有没有办法让我在循环开始时检查 glut 存储按键的缓冲区?我觉得必须有某种缓冲区来存储按键,因为是的,一旦上面的循环完成执行,它就会注册按键。
解决方案:
我现在实际上并没有在任何地方做任何循环(除了循环通过数组来更新我的烟花的位置等),我做了类似的事情
在 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】:你做错了。
您的按键处理程序应该不循环任何东西。您的按键处理程序应该简单地设置一些变量并返回。
您的主显示函数(应由调用glutPostRedisplay
的计时器函数驱动)应检查此变量。如果它已设置,那么它应该会点燃你的烟花并循环一段时间。
在此期间,您的按键处理程序应该简单地忽略任何进一步按下空格键。一旦显示功能完成烟花,它就可以响应进一步的按键操作。
【讨论】:
有趣。因此,当我按下空格键时,将新的烟花添加到我的缓冲区中,然后在显示中我应该循环它们并绘制?但是我在同一个地方不是吗?当显示中的循环正在运行时,如果我按空格键,它不会立即(或接近它)发射新的烟花,对吗?它仍然需要等待显示完成循环处理? @user979344:显示不应循环(不是您的意思)。显示应绘制一帧,然后退出。如果你需要绘制多个帧,那么你必须告诉 GLUT 再次调用你的显示循环。 我用你上面说的计时器来做这个?是否有内置计时器过剩?你到底什么意思?那我从哪里调用显示呢?似乎无论我怎么做,都必须有一个循环来绘制我的烟花(大约 200 帧,因此循环的 200 次迭代),在此期间任何按键都不会被注意到。以上是关于有没有办法检查过剩键缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章