一种可行的方法是允许将精灵帧放置在位图的任何位置(这样可以使它们更加紧凑),并且每个位图都附带一个(xml)文件,描述每个帧的位置、大小和起点,并列出所有动画。类似于这样的结构:
<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文件、读取位图,当开始动画时:启动一个定时器以固定的时间间隔触发。当它触发时,您通过逐一添加Keyframe的持续时间并在总和超过触发时间时停止来计算动画中的正确Keyframe;应该使用当前Keyframe。
在上面的XML文件中,我添加了一些东西,例如偏移量,允许您在动画期间修改精灵的位置(甚至可以进行插值以使其平滑移动)。
剩下的就是从位图中获取正确的帧。作为优化,您可以在加载XML文件时预处理位图,通过抓取帧并将其保留为微小位图,丢弃大位图。当位图较大且没有完全覆盖帧时,这可能会优化内存。
在其他情况下,您不进行预处理,只需复制帧。
对于较大的应用程序(更多的位图/动画/帧),我建议创建一个应用程序来创建和编辑XML文件。另一个选择可能是为您喜爱的绘画程序创建插件(如果可能)。