0

我有一个带有小字符的 OpenGL 程序,可以用箭头键在屏幕上移动。当一个人改变方向时,角色也会相应地改变它的方向,基本上是这样的:

 //Pressing the up arrow to go in the up direction 

 if(prevSwimDirection == RIGHT)
         swimAngle = 90;
 ...
 glutPostRedisplay(); 

游泳方向在代码其他地方的显示功能中得到处理:

  if(changesMode == SWIM_AROUND)
     glRotatef((GLfloat)swimAngle, 0.0, 0.0, 1.0);

当然,这会导致即时的、突然的方向变化。我试图像这样平滑它们,但没有运气:

   if(prevSwimDirection == RIGHT)
     for(double i = swimAngle; i < 90; i += 0.00001){
       swimAngle = i;
       glutPostRedisplay();
     }

我尝试用各种值增加 i 并最终意识到计算似乎是在重新显示之前执行的,即使我在整个循环中都调用了 glutPostRedisplay() 。换句话说,它仍然会突然改变方向,但有轻微的初始延迟。

有没有办法让它正常工作(或者,更好的是,有效地)?

4

1 回答 1

1

glutPostRedisplay 不会导致立即重绘,而只是设置一个标志,即下次事件循环迭代时将调用显示函数。

作为一般规则,您永远不应该从输入事件处理程序播放动画。相反,您应该设置动画参数,在您的情况下是新的目标方向,它应用于显示函数调用之间的动画代码。测量显示调用之间的时间并相应地推进动画。永远不要 通过循环播放动画!

于 2012-11-06T16:45:08.740 回答