gpt4 book ai didi

C++/SDL动画速度

转载 作者:太空狗 更新时间:2023-10-29 20:06:33 25 4
gpt4 key购买 nike

所以我正在按照在线教程开发游戏。目前,我在系统中内置了一些 FPS,以及一个使用像这样的 Sprite 片段的简单动画:

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 变量是通过计算自动画开始播放以来耗时来计算的。将其乘以动画速率,就可以得到在动画速率下已经通过了多少绝对帧。然后,您应用模运算符将此数字减少到动画长度的范围内,从而为您提供当时需要绘制的帧。

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

希望对您有所帮助。

关于C++/SDL动画速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7425890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com