我正在使用java进行游戏,当玩家侧身行走时,它看起来非常俗气。我被建议使用三帧动画,我一直在尝试这么多搜索,我似乎无法弄明白。
dir 是我用来获取玩家看的方式,0是前进的。
精灵是获取图像,玩家F,玩家F_1和玩家F_2都是前进角色。
行走是动画的布尔值
动画是动画的缩写。
if (dir == 0) {
sprite = Sprite.playerF;
if (walking) {
if (anim % 40 > 20) {
sprite = Sprite.playerF_1;
} else {
sprite = Sprite.playerF_2;
}
}
}
我先谢谢你,帮助我创建一个3帧动画。
答案 0 :(得分:3)
我会这样做。
此方法可以根据您的需要扩展到尽可能多的方向(例如包括对角线)和帧,而无需对大块的其他if块进行硬编码。
创建一个枚举以保留可能的方向。
enum Direction{
Forward,
Backward,
Left,
Right
};
然后创建一个EnumMap
,使用方向作为键,并具有Sprite数组的值
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)];
}
答案 1 :(得分:2)
只需添加if / elseif链中的第三个选项:
if (walking) {
if (anim % 40 >= 30) {
sprite = Sprite.playerF_2;
else if (anim % 40 >= 20) {
sprite = Sprite.playerF_1;
} else if (anim % 40 >= 10) {
sprite = Sprite.playerF_2;
} else {
sprite = Sprite.playerF_3;
}
}