这是我将如何做到的。
此方法可以扩展到尽可能多的方向(例如,包括对角线)和帧,而无需对大量 else if 块进行硬编码。
创建一个枚举来保存您可能的方向。
enum Direction{
Forward,
Backward,
Left,
Right
};
然后创建一个EnumMap
使用方向作为键并具有 Sprites 数组的值
EnumMap<Direction,Sprite[]> animations = null;
然后将每个动画的帧添加到各自的方向
animations.put(Direction.Forward,new Sprite[]{Sprite.Sprite.playerF,Sprite.playerF_1,Sprite.playerF_2});
现在要执行您的绘图更新功能,您所要做的就是
if(walking){
sprite = animations.get(dir)[getFrame(anim)];
}
现在来处理决定使用什么框架。假设anim
是某种帧计数器,并且您希望更新的频率低于每帧。
对于循环,例如。1,2,3,1,2,3,... 动画:
int getFrame(int anim){
return (anim / UPDATE_FREQUENCY) % FRAME_COUNT;
}
或用于弹跳动画,例如。1,2,3,2,1,2,3,... 在您的绘图部分保留一个变量,以跟踪绘制的数字框架以及当前的方向。
int getFrame(int anim, int frameNum, Boolean incrementDirection){
int frame;
if(anim % UPDATE_FREQUENCY == 0){
if(Math.abs(frameNum) == FRAME_COUNT-1)
frameNum = 0-frameNum;
frameNum ++;
}
return frameNum;
}
为了实现这个版本,绘制代码将被更改为
int frame = 1;
if(walking){
frame = getFrame(anim,frame);
sprite = animations.get(dir)[Math.abs(frame)];
}