我正在阅读这本书SDL game development。在第一个项目中,有一些代码用于移动精灵表的渲染帧的坐标:
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初始化之后获得毫秒数。
答案 0 :(得分:3)
模运算符占用除法的其余部分。因此,例如,如果GetTicks()是2600,则首先除以100使其为26并且26的模6为2.因此它是第2帧。
如果GetTicks()是3300;你除以100得到33;模数6的33是3;第3帧。
答案 1 :(得分:1)
每帧将显示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帧,这可能不是真的,因为在开始时有很多事情需要花费时间。但是对于简单的演示来说明帧的循环,这已经足够了。
希望这有帮助。