你如何控制动画的速度?我的物体在另一台机器上的动画效果更快.
void idle(void){
if (!wantPause){
circleSpin = circleSpin + 2.0; //spin circles
if(circleSpin > 360.0)
{
circleSpin = circleSpin - 360.0;
}
diamondSpin = diamondSpin - 4.0; //spin diamonds
if(diamondSpin > 360.0)
{
diamondSpin = diamondSpin + 360.0;
}
ellipseScale = ellipseScale + 0.1; //scale ellipse
if(ellipseScale > 30)
{
ellipseScale = 15;
}
glutPostRedisplay();
}
}
void drawScene()
{
...
glColor3f(1,0,0);
glPushMatrix();
glRotatef(circleSpin,0,0,1);
drawOuterCircles();
glPopMatrix();
}
int main (int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowSize(400,400);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Lesson 6");
init();
glutDisplayFunc(drawScene);
glutKeyboardFunc(keyboard);
glutReshapeFunc(handleResize);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Kor*_*icz 10
这是穷人的解决方案:
FPS = 60.0;
while (game_loop) {
int t = getticks();
if ((t - t_prev) > 1000/FPS)
process_animation_tick();
t_prev = t;
}
Run Code Online (Sandbox Code Playgroud)
这是更好的解决方案:
GAME_SPEED = ...
while (game_loop) {
int t = getticks();
process_animation((t - t_prev)*GAME_SPEED/1000.0);
t_prev = t;
}
Run Code Online (Sandbox Code Playgroud)
在第一个中,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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3892 次 |
| 最近记录: |