如何在 GLUT 中调度函数

Posted

技术标签:

【中文标题】如何在 GLUT 中调度函数【英文标题】:How to schedule function in GLUT 【发布时间】:2011-04-07 17:35:24 【问题描述】:

我有一些从主函数调用的函数。下面是代码。

int main(int argc, char *argv[])



    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

    glutInitWindowSize (500, 500);

    glutInitWindowPosition (100, 100);

    glutCreateWindow("Game for Gamers");

    glutDisplayFunc(display_func);

    glutKeyboardFunc(keyboard);

    glutSpecialFunc(special);

    glutTimerFunc(50,refreshcheck,0);

    glutIdleFunc (animate);

    glutReshapeFunc (reshape);

    glutMainLoop();


    return 0;


这里“refreshcheck”首先调用我想在执行“display_func”函数后调用“refreshcheck”函数。如何安排它。我想在“refreshcheck”之前在内存中加载游戏时首先调用“display_func”执行函数函数,游戏运行时,display_func之后不需要调用refreshcheck,但第一次很重要。

【问题讨论】:

refreshcheck 里面有什么?可能有一种方法可以避免使用计时器。 在这个函数中,我为每个球和平面上的移动对象使用了碰撞检测检查模块。display_func 正在创建对象,这就是我想要调用它的原因。 我可以用逻辑控制,但我正在寻找一些 Glut 的标准用法。 您不应在 display_func 中创建对象。在进入 glutMainLoop 之前调用的另一个函数中创建它们。 【参考方案1】:

一般来说,您不应该在 displayFunc 中创建对象(正如 dark_charlie 正确指出的那样)。但这只是不好的做法,仅此而已。

如果你需要碰撞检测,你应该让它与渲染同步,即从你的 displayFunc 调用它(在它结束时)。

我猜你想使用计时器的原因是要有恒定的步长物理。这通常以另一种方式完成,使用 gettimeofday()(或 Windows 上的 GetTickCount())来获取时间,并根据帧之间经过的时间,物理调用 N 次。与使用 GLUT 计时器相比,这将使您获得更好的精度,因为计时器的精确度最高只有 10 毫秒,这在处理快速移动的物体时可能会很多,从而导致卡顿。

【讨论】:

以上是关于如何在 GLUT 中调度函数的主要内容,如果未能解决你的问题,请参考以下文章

在 GLUT 中打印整数的函数 - 如何编写用于将 int 转换为 char 的函数?

如何在 GLUT 中获得显示功能?

opengl中如何实现图象的缩放

如何检查GLUT中是不是未按下键?

OpenGL/Glut glutSolidCube()

使用 GLUT 绘制圆锥和圆柱