2

我正在用java开发一个游戏,当玩家侧身行走时,它看起来真的很俗气。有人建议我使用三帧动画,我已经尝试了很多搜索,但我似乎无法弄清楚。

dir是我用来获取玩家正在看的方向的东西,0 是向前的。
sprite是获取图像,playerF、playerF_1、playerF_2都是给前锋的。
walk是动画是否进行的布尔值。
anim是动画的缩写。

if (dir == 0) {
    sprite = Sprite.playerF;
    if (walking) {
        if (anim % 40 > 20) {
            sprite = Sprite.playerF_1;
        } else {
            sprite = Sprite.playerF_2;
        }
    }
}

非常感谢您帮助我创建 3 帧动画。

4

2 回答 2

3

这是我将如何做到的。

此方法可以扩展到尽可能多的方向(例如,包括对角线)和帧,而无需对大量 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)];
}
于 2013-06-27T04:53:41.167 回答
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;
        }
    }
于 2013-06-27T03:52:59.047 回答