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