Это решение для бедняка:
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 перемещает ваш объект на фиксированную величину, но это может привести к ошибкам, если частота кадров упадет.
В последнем случае вы перемещаете объекты на основе прошедшего времени. Например. если прошло 20 мс, вы поворачиваете объект на 12 градусов, а если 10 мс, вы поворачиваете его на 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;
}
}
}