了解SDL帧动画

Understanding SDL frame animation

本文关键字:动画 SDL 了解      更新时间:2023-10-16

我正在完成SDL游戏开发这本书。在第一个项目中,有一段代码用于移动精灵表渲染帧的坐标:

void Game::update()
{
    m_sourceRectangle.x = 128 * int((SDL_GetTicks()/100)%6);
}

我很难理解这一点。。。我知道它每100毫秒沿着x轴移动m_sourceRectangle 128个像素……但它实际上是如何工作的?有人能分解这个代码的每个元素来帮助我理解吗?

我不明白为什么需要调用SDL_GetTicks()来执行此操作。。。

我也知道%6在那里,因为动画中有6帧。。。但它实际上是怎么做到的呢?

书中写道:

在这里,我们使用SDL_GetTicks()来找出自SDL初始化以来的毫秒数。然后,我们将其除以帧之间所需的时间量(以毫秒为单位),然后使用模运算符来保持它在我们动画中的帧数范围内。此代码将(每100毫秒)将源矩形的x值偏移128像素(一帧的宽度),乘以我们想要的当前帧,给我们正确的位置。构建项目,您应该会看到显示的动画。

但我不确定我是否理解为什么自SDL初始化以来获得毫秒数是有效的。

模运算符取除法的剩余部分。例如,如果GetTicks()为2600,则首先除以100使其为26,26的模6为2。因此是第2帧。

如果GetTicks()为3300;你除以100得到33;33的模6为3;框架3。

每一帧都会显示100ms,所以在T=0ms时是第0帧,T=100ms时是100/100帧,T=200ms时是200/100帧,依此类推。所以在T=SDL_GetTicks()ms时,是SDL_GetTicks()/100帧。但相比之下,只有6帧在一起并循环,因此在T=SDL_GetTicks()ms时,它处于面帧(SDL_GetTicks()/100) % 6

这里有一个假设,当程序启动时,会显示第0帧,这可能不是真的,因为启动时有很多事情要做,需要时间。但对于演示帧循环的简单演示来说,它已经足够好了。

希望这能有所帮助。