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

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 次迭代),在此期间任何按键都不会被注意到。

以上是关于有没有办法检查过剩键缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中为了避免缓冲区溢出应尽量使用哪些函数

WebGL 中有没有办法快速反转模板缓冲区?

有没有办法确定sqlplus缓冲区是不是已经发送到服务器?

有没有办法在 Java 中压缩字节缓冲区?

在 Linux 上将文本和命令键写入 TTY

在编译时检查堆栈使用情况