这是穷人的解决方案:
FPS = 60.0; while (game_loop) { int t = getticks(); if ((t - t_prev) > 1000/FPS) process_animation_tick(); t_prev = t; }
这是更好的解决方案:
GAME_SPEED = ... while (game_loop) { int t = getticks(); process_animation((t - t_prev)*GAME_SPEED/1000.0); t_prev = t; }
在第一个中,getframe将您的对象移动一个固定的数量,但如果帧速率下降,则容易出错.
在后者中,您可以根据传递的时间移动对象.例如,如果20ms通过,则将对象旋转12度,如果经过10ms,则将其旋转6度.通常,动画如果时间函数通过.
实施getticks()
取决于您.首先你可以使用glutGet(GLUT_ELAPSED_TIME)
.
在你的情况下,它看起来像:
int old_t; void idle(void) { int t = glutGet(GLUT_ELAPSED_TIME); int passed = t - old_t; old_t = t; animate( passed ); glutPostRedisplay(); } void animate( int ms ) { if (!wantPause){ circleSpin = circleSpin + ms*0.01; //spin circles if(circleSpin > 360.0) { circleSpin = circleSpin - 360.0; } diamondSpin = diamondSpin - ms*0.02; //spin diamonds if(diamondSpin > 360.0) { diamondSpin = diamondSpin - 360.0; } ellipseScale = ellipseScale + ms*0.001; //scale ellipse if(ellipseScale > 30) { ellipseScale = 15; } } }