了解SDL帧动画
Understanding SDL frame animation
我正在完成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帧,这可能不是真的,因为启动时有很多事情要做,需要时间。但对于演示帧循环的简单演示来说,它已经足够好了。
希望这能有所帮助。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- 使用 GLUT 使用键停止动画?
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 使用对象数组对 SFML 进行动画处理
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 如何减慢从 BVH 文件读取的 opengl 动画?
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- 从精灵表在 sfml 中为精灵制作动画
- 无法在 SDL 2 中创建平滑动画
- 了解SDL帧动画
- C++/SDL/OpenGL中的平滑动画问题
- SDL动画精灵
- SDL如何在按键时设置精灵的动画