Android 在LibGDX中循环动画一次

Android 在LibGDX中循环动画一次,android,animation,libgdx,Android,Animation,Libgdx,我有一个爆炸动画,我需要循环一次,然后消失,但不起作用, 这部分应该完成以下任务:birdAnimationHit.setPlayModeAnimation.NORMAL 但它只显示循环的最后一个图像。不知道怎么了,这是我的密码 AssetLoader.java public static void load() { texture = new Texture(Gdx.files.internal("data/texture.png")); texture.setFilter(T

我有一个爆炸动画,我需要循环一次,然后消失,但不起作用, 这部分应该完成以下任务:birdAnimationHit.setPlayModeAnimation.NORMAL

但它只显示循环的最后一个图像。不知道怎么了,这是我的密码

AssetLoader.java

public static void load() {
    texture = new Texture(Gdx.files.internal("data/texture.png"));
    texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    dustHit1 = new TextureRegion(texture, 930, 154, 140, 158);
    dustHit1.flip(false, true);

    dustHit2 = new TextureRegion(texture, 1079, 154, 187, 158);
    dustHit2.flip(false, true);

    dustHit3 = new TextureRegion(texture, 1274, 154, 149, 158);
    dustHit3.flip(false, true);

    dustHit4 = new TextureRegion(texture, 1430, 154, 153, 158);
    dustHit4.flip(false, true);

    dustHit5 = new TextureRegion(texture, 1590, 154, 155, 158);
    dustHit5.flip(false, true);

    TextureRegion[] birdsHit = { dustHit1, dustHit2, dustHit3, dustHit4, dustHit5 };
    birdAnimationHit = new Animation(0.06f, birdsHit);
    birdAnimationHit.setPlayMode(Animation.NORMAL);
}
GameRenderer.java

private void drawBirdHit(float runTime) {

    batcher.draw(birdAnimationHit.getKeyFrame(runTime), bird.getX(),
            bird.getY(), bird.getWidth() / 2.0f,
            bird.getHeight() / 2.0f, bird.getWidth(), bird.getHeight(),
            1.4f, 1.4f, bird.getRotation());

}

您需要总结该逻辑中的运行时。否则你总是得到同样的画面。看看getKeyFrame方法:为您标记导入部分

public TextureRegion getKeyFrame (float stateTime) {
    int frameNumber = getKeyFrameIndex(stateTime);
    return keyFrames[frameNumber];
}

public int getKeyFrameIndex (float stateTime) {
    if (keyFrames.length == 1) return 0;

    int frameNumber = (int)(stateTime / frameDuration); //this will always produce the same picture if you dont sum up the time!
    switch (playMode) {
    case NORMAL:
    frameNumber = Math.min(keyFrames.length - 1, frameNumber);
    break;
    case LOOP:
    frameNumber = frameNumber % keyFrames.length;
    break;
    case LOOP_PINGPONG:
    frameNumber = frameNumber % ((keyFrames.length * 2) - 2);
    if (frameNumber >= keyFrames.length) frameNumber = keyFrames.length - 2 - (frameNumber - keyFrames.length);
    break;
    case LOOP_RANDOM:
    frameNumber = MathUtils.random(keyFrames.length - 1);
    break;
    case REVERSED:
    frameNumber = Math.max(keyFrames.length - frameNumber - 1, 0);
    break;
    case LOOP_REVERSED:
    frameNumber = frameNumber % keyFrames.length;
    frameNumber = keyFrames.length - frameNumber - 1;
    break;
    }
    return frameNumber;
}
所以在某个地方放一个计时器,在那里你可以计算出deltatimes的总数

并将代码更改为以下内容:

private void drawBirdHit(float runTime) {
    sum += runTime;
    batcher.draw(birdAnimationHit.getKeyFrame(sum), bird.getX(),
            bird.getY(), bird.getWidth() / 2.0f,
            bird.getHeight() / 2.0f, bird.getWidth(), bird.getHeight(),
            1.4f, 1.4f, bird.getRotation());
}

动画本身没有计时器。您可以根据过去的时间而不是当前的延迟时间请求正确的关键帧。

您需要在该逻辑中总结运行时。否则你总是得到同样的画面。看看getKeyFrame方法:为您标记导入部分

public TextureRegion getKeyFrame (float stateTime) {
    int frameNumber = getKeyFrameIndex(stateTime);
    return keyFrames[frameNumber];
}

public int getKeyFrameIndex (float stateTime) {
    if (keyFrames.length == 1) return 0;

    int frameNumber = (int)(stateTime / frameDuration); //this will always produce the same picture if you dont sum up the time!
    switch (playMode) {
    case NORMAL:
    frameNumber = Math.min(keyFrames.length - 1, frameNumber);
    break;
    case LOOP:
    frameNumber = frameNumber % keyFrames.length;
    break;
    case LOOP_PINGPONG:
    frameNumber = frameNumber % ((keyFrames.length * 2) - 2);
    if (frameNumber >= keyFrames.length) frameNumber = keyFrames.length - 2 - (frameNumber - keyFrames.length);
    break;
    case LOOP_RANDOM:
    frameNumber = MathUtils.random(keyFrames.length - 1);
    break;
    case REVERSED:
    frameNumber = Math.max(keyFrames.length - frameNumber - 1, 0);
    break;
    case LOOP_REVERSED:
    frameNumber = frameNumber % keyFrames.length;
    frameNumber = keyFrames.length - frameNumber - 1;
    break;
    }
    return frameNumber;
}
所以在某个地方放一个计时器,在那里你可以计算出deltatimes的总数

并将代码更改为以下内容:

private void drawBirdHit(float runTime) {
    sum += runTime;
    batcher.draw(birdAnimationHit.getKeyFrame(sum), bird.getX(),
            bird.getY(), bird.getWidth() / 2.0f,
            bird.getHeight() / 2.0f, bird.getWidth(), bird.getHeight(),
            1.4f, 1.4f, bird.getRotation());
}

动画本身没有计时器。您可以根据过去的时间而不是当前的延迟时间请求正确的关键帧。

我所做的只是将空白帧作为任何动画的最后一帧;每个精灵工作表只需要一个可用于多个动画的工作表。然后只需调用停止/播放方法,动画将运行然后消失,准备在碰撞或其他情况下进行下一次播放。

我所做的只是将空白帧作为任何动画的最后一帧;每个精灵工作表只需要一个可用于多个动画的工作表。然后只要调用stop/play方法,动画就会运行然后消失,准备在碰撞或其他情况下进行下一次播放。

我在代码中添加了sum变量,但是你不知道该怎么做,比如说在某个地方挂一个计时器,在那里你计算deltatimes的总数如果你把sum变量添加为member,那么它应该可以工作,你就可以解决这个bug了。只需在类中保存一个float成员变量,在该类中使用动画求和,在该类中求和运行时。这是您需要传递给getKeyFrame方法的变量我将sum变量添加到我的代码中,但不知道该做什么,您可以说在某个地方保留一个计时器,在该计时器中汇总增量。如果您将sum变量添加为成员,那么它应该可以工作,并且您就可以处理该错误了。只需在类中保存一个float成员变量,在该类中使用动画求和,在该类中求和运行时。这是需要传递给getKeyFrame方法的变量