2014-06-02 4 views
1

У меня есть анимация взрыва, мне нужно в цикле один раз, а затем исчезнуть, но не работает, Эта часть его должна сделать трюк: birdAnimationHit.setPlayMode(Animation.NORMAL);Loop анимация раз в LibGDX

Но это только показывает последнее изображение петля. Не знаю, что это неправильно, вот мой код

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

} 

ответ

3

Вы должны подвести итог RUNTIME внутри этой логики. Кроме того, вы всегда получаете один и тот же фрейм. Посмотрите на метод 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; 
} 

Так держать где-то таймер, где вы sumup в 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()); 
} 

У самой анимации для этого нет таймера. Вы можете запросить правильный ключевой кадр в зависимости от прошедшего времени, а не от текущего дельтатима.

+0

Я добавил переменную суммы в свой код, но не знаю, что делать, когда вы говорите «где-нибудь где-то таймер, где вы суммируете дельты» – RonEskinder

+0

Если вы добавили переменную суммы в качестве члена, она должна работать, и вы будете готовы с ошибкой. Просто держите переменную члена float внутри своего класса, где вы используете анимацию (сумму), где вы суммируете runTime. Это переменная, которую нужно передать методу getKeyFrame. – BennX

2

То, что я делаю, просто включает пустую рамку в качестве последнего кадра любой анимации; вам нужен только один лист спрайта, который можно использовать для нескольких анимаций. Затем просто вызовите методы остановки/воспроизведения, анимация запустится, затем исчезнет, ​​готова к следующей игре при столкновении или что-то еще.

Смежные вопросы