一种可行的方法是允许将精灵的帧放置在位图中的任何位置(这样可以使它们更紧凑),并为每个位图附上一个描述位置、大小和来源的 (n xml) 文件每帧 AND 都有所有动画的列表。像这样的:
<SpriteSheet>
<Frames>
<Frame id="0" location="20,40" size="64,64" origin="32,32" />
<Frame id="1" location="100,40" size="64,64" origin="32,32" />
<Frame id="2" location="164,40" size="64,64" origin="0,0" />
<Frame id="3" location="20,120" size="64,64" origin="32,32" />
</Frames>
<Animations>
<Animation name="walk left" >
<Keyframes>
<Keyframe frameId="0" duration="0:0:0.5" offset="-5,0" />
<Keyframe frameId="1" duration="0:0:0.5" offset="-5,0" />
<Keyframe frameId="2" duration="0:0:0.4" offset="-2,0" />
<Keyframe frameId="1" duration="0:0:0.5" offset="-5,0" />
</Keyframes>
</Animation>
<Animation name="walk right" >
<Keyframes>
<Keyframe frameId="5" duration="0:0:0.5" offset="5,0" />
<Keyframe frameId="6" duration="0:0:0.5" offset="5,0" />
<Keyframe frameId="2" duration="0:0:0.4" offset="2,0" />
<Keyframe frameId="6" duration="0:0:0.5" offset="5,0" />
</Keyframes>
</Animation>
</Animations>
</SpriteSheet>
通过这种方式,您可以在动画中重复使用帧(从而进一步优化位图大小)并通过简单地编辑 XML 文件来自定义动画。
您所要做的就是读取 XML 文件、读取位图并在开始动画时:启动一个定期计时的计时器。当它滴答作响时,您可以通过将关键帧的持续时间一一添加并在总和超过滴答时间时停止来计算动画中的正确关键帧;应该使用当前的关键帧。
在上面的 XML 文件中,我添加了诸如偏移之类的东西,它允许您在动画期间修改精灵的位置(您甚至可以对其进行插值以使其平滑移动)
剩下的就是从位图中抓取正确的帧。作为一种优化,您可以在加载 XML 文件时通过抓取帧来预处理位图,将它们保留为小位图,并丢弃大位图。当位图很大并且没有完全覆盖在帧中时,这可能会优化内存。
在其他情况下,您无需进行预处理,只需 blit 帧即可。
对于较大的应用程序(更多位图/动画/帧),我建议创建一个应用程序来创建和编辑 XML 文件。另一种选择可能是为您最喜欢的绘画程序创建一个插件(如果可能的话)