【问题标题】:C++ OpenGL Pong ball moving too fastC++ OpenGL乒乓球移动太快
【发布时间】:2013-02-19 03:39:43
【问题描述】:

我正在尝试使用 opengl 在 C++ 中创建一个简单的乒乓球游戏。我在屏幕上显示了边框,桨,球,它们都在移动,太棒了!问题是,即使以一个像素的速度,球也会以闪电般的速度移动。

我在一个名为 init 的回调函数中更新它的位置,然后我将它传递给 glutIdleFunc,如下所示:glutIdleFunc(idle);

idle函数如下:

void idle(){
    ball.moveLeft();

    glutPostRedisplay();
}

基本上我只是让它向左移动一个像素,但是,我猜空闲被调用了很多,所以它移动得很快。如何解决此错误?

如果您需要更多信息,请询问!

【问题讨论】:

  • 时间在任何模拟中都是一个非常重要的方面。考虑两帧之间经过的时间。
  • 我不熟悉glut,但一个叫做IdleFunc 的东西似乎不适合给我提供图形更新!
  • 使用glutTimerFunc。 GLUT 计时器只触发一次,所以不要忘记在回调中再次设置它。

标签: c++ opengl timer pong


【解决方案1】:

使用 GLUT 计时器每 16 毫秒触发一次 display() 回调:

void timer( int extra )
{
    glutPostRedisplay();
    glutTimerFunc( 16, timer, 0 );
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( ... );
    glutInitWindowSize( ... );
    glutCreateWindow( ... );
    ...
    glutTimerFunc( 0, timer, 0 );
    ...
    glutMainLoop();
    return 0;
}

【讨论】:

  • 但我正在更新它在空闲函数中的位置。然后调用 glutPostRedisplay();哪些调用显示所以我们不需要限制空闲功能的速度吗?
  • 不要使用idle功能,只使用定时器。
  • 那么还要将ball.moveLeft()添加到定时器函数中?
  • Sweet,为了让它移动得更快,我是切换它的速度,还是减少计时器的毫秒等待时间?
  • 请注意,glutTimerFunc 不保证它会每 16 毫秒执行一次回调。当您的帧速率发生变化时,您应该找出确切的时间以避免意外。
【解决方案2】:

这是我找到的一个博客链接,该链接讨论了如何获得过剩时间以显示每秒帧数。

http://www.lighthouse3d.com/tutorials/glut-tutorial/frames-per-second/

您需要确定球的速度(以像素/秒为单位)。然后将该速度乘以上次更新和当前更新之间经过的秒数。根据博客,您可以通过 glutGet(GLUT_ELAPSED_TIME) 获得此信息。如果这不起作用,请谷歌了解如何在您的平台上找到当前时间(以毫秒为单位)。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多