C++ OpenGL Pong球移动太快

4
我将尝试使用OpenGL用C ++创建一个简单的乒乓球游戏。我已经在屏幕上显示边框,挡板,球,并且它们都可以移动,这很不错!问题是即使速度为一像素,球也移动得非常快。
我在回调函数init中更新它的位置,然后将其传递给glutIdleFunc,如下所示: glutIdleFunc(空闲); idle函数如下:
void idle(){
    ball.moveLeft();

    glutPostRedisplay();
}

本质上我只是让它向左移动一个像素,但是我想闲置状态(idle)被频繁调用,所以它移动得非常快。该如何修复这个错误?

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


1
时间是任何模拟中非常重要的一个方面。考虑两个帧之间经过的时间。 - Mark Garcia
我不熟悉glut,但是叫做IdleFunc的东西似乎不是我放置图形更新的地方! - us2012
使用 glutTimerFunc。GLUT 定时器只会触发一次,所以不要忘记在回调函数中重新设置它。 - n. m.
2个回答

2

我找到了一篇博客,讲述如何在glut中显示每秒帧数的时间。以下是链接:

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

您需要决定您的球以像素/秒为单位的速度。然后将该速度乘以自上次更新和当前更新之间经过的秒数。根据博客内容,您可以通过使用glutGet(GLUT_ELAPSED_TIME)来获取此值。如果不行,请在您的平台上搜索如何以毫秒为单位查找当前时间。

希望这能帮上忙。


2

使用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(); 这将调用显示函数,所以我们不需要限制空闲函数的速度吗? - samuraiseoul
不要使用空闲函数,直接使用计时器。 - genpfault
那么也将 ball.moveLeft() 添加到计时器函数中? - samuraiseoul
要让它移动得更快,我是改变它的速度还是减少计时器的毫秒等待时间? - samuraiseoul
保持每帧16毫秒的恒定速度,增加每帧对象移动的单位数。 - genpfault
4
请注意,glutTimerFunc不能保证每16毫秒准确回调一次。您应该找出准确的时间,以避免帧率变化时出现意外情况。 - Roger Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接