android - 在 LibGDX 中循环动画一次

标签 android animation libgdx

我有一个爆炸动画,我需要循环一次然后消失,但它不起作用, 这部分应该可以解决问题:birdAnimationHit.setPlayMode(Animation.NORMAL);

但它只显示循环的最后一张图像。不知道哪里出了问题,这是我的代码

资源加载器.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);
}

游戏渲染器.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 方法:(为您标记了 importend 部分)

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;
}

所以在某个地方放一个计时器,你可以在其中总结增量时间

并将您的代码更改为如下内容:

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());
}

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

关于android - 在 LibGDX 中循环动画一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23999789/

相关文章:

background - libGDX 渲染大背景图像的最佳方法是什么?

unit-testing - 找不到Gradle命令行 Assets 中的Libgdx测试

java - LwjglCanvas 与 JFrame 调整大小

java - 迭代来自同一基类的不同对象

android - 如何在 Android 上通过单个 Intent 同时显示短信和拨号应用程序?

android - 电池管理器中android EXTRA_SCALE和LEVEL的单位

javascript - 这个body fadeIn动画是怎么做的?

angular - 数字计数器上的 ionic 3 Angular 动画

java - 反编译APK,修改Activity并重新编译为APK

java - 用颜色填充(逐渐)ellispe2D 对象 - Java 动画