【问题标题】:Understanding SDL frame animation了解 SDL 帧动画
【发布时间】:2015-03-20 15:37:46
【问题描述】:

我正在阅读本书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 初始化以来的毫秒数。

【问题讨论】:

    标签: c++ sdl sdl-2


    【解决方案1】:

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

    如果 GetTicks() 是 3300;你除以 100 得到 33; 33 的模 6 是 3;第 3 帧。

    【讨论】:

    • 感谢您的回答......这有助于我理解模数的用途......但是将 GetTicks() 乘以我们希望帧在屏幕上显示的毫秒数怎么样?将刻度乘以一个数字如何意味着它会在屏幕上显示多长时间?
    • 一个滴答基本上是一个程序中的一个循环。这是对程序运行时间的一种衡量。乘以您想要的毫秒数是行不通的。相反,您可以增加除数。
    • 对不起,我的意思是除法……为什么除法毫秒数会在那个时候改变?
    【解决方案2】:

    每帧将显示 100 毫秒,因此在 T=0 毫秒时为第 0 帧,在 t=100 毫秒时为帧 100/100,在 T=200 毫秒时为帧 200/100,依此类推。所以在 T=SDL_GetTicks() ms 时,它是 Frame SDL_GetTicks()/100。但是比你只有 6 帧加在一起并且循环,因此在 T=SDL_GetTicks() 毫秒它是面对帧(SDL_GetTicks()/100) % 6

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      相关资源
      最近更新 更多