我有一个爆炸动画我需要循环一次然后消失,但是不起作用,
这部分它应该做的伎俩:birdAnimationHit.setPlayMode(Animation.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());
}
答案 0 :(得分: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;
}
因此,请在某个地方保留一个汇总增量时间的计时器
并将您的代码更改为以下内容:
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());
}
动画本身没有计时器。您可以根据过去的时间而不是当前的deltatime请求正确的关键帧。
答案 1 :(得分:2)
我所做的只是包含一个空白帧作为任何动画的最后一帧;你只需要一个可用于多个动画的精灵表。然后只需调用停止/播放方法,动画就会运行然后消失,准备好下次碰撞或等等。