4

我正在尝试使用 libGDX 实现一个简单的动画,但我目前正坚持一件事。可以说我有一堆精灵需要一些时间才能完成。例如,大约 30 个精灵像这个链接:https ://github.com/libgdx/libgdx/wiki/2D-Animation

但是,在动画完成之前,按下了一些键。对于流畅的动画,我希望在开始下一组动画之前完成 30 帧,以防止突然停止。

所以我的问题是如何在 libGDX 中实现它?我目前的想法是扩展Animation类,它将跟踪我拥有的帧以及渲染了多少帧,然后显示其余的。或使用该isAnimationFinished(float stateTime)功能(尽管我没有运气使用它)。

我见过的像 superjumper 这样的例子只有很少的动画,并没有真正改变太多。

另外,有没有办法保存TextureAtlas.createSprites方法中的精灵列表并将它们与动画类一起使用?如果不是,那么提供这个功能的目的是什么?

谢谢

4

3 回答 3

5

您可以使用

animation.isAnimationFinished(stateTime);

看看你的动画是否完成。

对于精灵:我个人使用 TextureAtlas 中的 TextureRegion 并将它们存储在一个数组中以用于我的动画

于 2013-02-18T15:52:10.507 回答
2

我创建了一个AnimatedImage扩展Image为在 Image 中自动生成精灵的类。我的代码将是这样的:

public class AnimatedImage extends Image{
    private Array<Array<Sprite>> spriteCollection;
    private TextureRegionDrawable drawableSprite;
    private Animation _animation;
    private boolean isLooping;
    private float stateTime;
    private float currentTime;


    public AnimatedImage(Array<Array<Sprite>> _sprites, float animTime, boolean _looping){
//      set the first sprite as the initial drawable
        super(_sprites.first().first());
        spriteCollection = _sprites;

//      set first collection of sprite to be the animation
        stateTime = animTime;
        currentTime = 0;
        _animation = new Animation(stateTime, spriteCollection.first());

//      set if the anmation needs looping
        isLooping = _looping;
        drawableSprite = new TextureRegionDrawable(_animation.getKeyFrame(currentTime));
        this.setDrawable(drawableSprite);
    }

    public void update(float delta){
        currentTime += delta;
        TextureRegion currentSprite = _animation.getKeyFrame(currentTime, isLooping);
        drawableSprite.setRegion(currentSprite);
    }

    public void changeToSequence(int seq){
//      reset current animation time
        resetTime();
        _animation = new Animation(stateTime, spriteCollection.get(seq));
    }

    public void changeToSequence(float newseqTime, int seq){
        _animation = new Animation(newseqTime, spriteCollection.get(seq));
    }

    public void setRepeated(boolean _repeat){
        isLooping = _repeat;
    }

    public boolean isAnimationFinished(){
        return _animation.isAnimationFinished(currentTime);
    }

    public void resetTime(){
            currentTime = 0;
    }


}

changetosequence方法将使 newAnimation用于更新该方法的当前TextureRegionDrawableupdateresetTime调用时将重置动画的总时间changeToSequence。您可以添加事件侦听器以调用 changeToSequence 方法。

这是示例:

private AnimatedImage _img;

然后我像这样添加 InputListener:

_img.addListener(new InputListener(){
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
                _img.changeToSequence(1);
                return true;

            }
        });

希望能帮助到你。

于 2013-05-24T11:55:03.823 回答
1

对这种动画使用补间引擎。它有据可查,libgdx 支持它.. 谷歌关于它,你可以找到一堆使用 libgdx 的例子.. 希望它会帮助你!

于 2013-09-07T19:36:56.617 回答