其他分享
首页 > 其他分享> > C / SDL动画速度

C / SDL动画速度

作者:互联网

所以我正在开发一款游戏,遵循在线教程.目前我在系统中内置了一些FPS,以及一个使用精灵片段的简单动画:

if( frameCount > 12 )
        frameCount = 0;

    //hero frames   
    SDL_Rect clip[ 13 ];

    clip[ 0 ].x = 0;
    clip[ 0 ].y = 0;
    clip[ 0 ].w = 44;
    clip[ 0 ].h = 39;

    clip[ 1 ].x = 51;
    clip[ 1 ].y = 0;
    clip[ 1 ].w = 44;
    clip[ 1 ].h = 39;

    clip[ 2 ].x = 102;
    clip[ 2 ].y = 0;
    clip[ 2 ].w = 44;
    clip[ 2 ].h = 39;
    ...
    ...
    SDL_BlitSurface( hero, &clip[ frameCount ], destination, &offset );
    frameCount++;

现在这个工作正常,while循环的每次迭代都会使它在动画中播放下一帧(顺便说一下,这个动画是角色类的一部分).

我面临的问题是动画的速度.它发生在游戏的当前FPS,即60.我希望能够分别控制玩家动画的速度,所以我可以将它减慢到合理的速度.

有没有人对我如何做到这一点有任何建议?

注意:共有13帧.

解决方法:

您将刷新率(60 fps)与动画速率分开.在我看来,最好的解决方案是将动画速率与实时时钟联系起来.在SDL中,您可以使用SDL_Ticks()函数执行此操作,您可以使用该函数以毫秒分辨率测量时间.

举个例子,考虑这个例子(不是工作代码,只是草图):

void init() {
    animationRate = 12;
    animationLength = 13;
    startTime = SDL_Ticks();
}

void drawSprite() {
    int frameToDraw = ((SDL_Ticks() - startTime) * animationRate / 1000) % animationLength;
    SDL_BlitSurface( hero, &clip[ frameToDraw ], destination, &offset );
}

如果不清楚,则通过计算自动画开始播放以来经过的时间来计算frameToDraw变量.您可以将其乘以动画速率,并获得动画速率的绝对帧数.然后应用模运算符将此数字减少到动画长度的范围,并为您提供当时需要绘制的帧.

如果您的刷新率低于动画速率,则精灵将跳过帧以跟上请求的动画速率.如果刷新率更快,则将重复绘制相同的帧,直到显示下一帧的时间到来.

我希望这有帮助.

标签:frame-rate,c,animation,sdl
来源: https://codeday.me/bug/20190726/1541723.html