2017-08-03 6 views
0

Ich versuche, eine Explosionsanimation zu laden. Die Animationen bestehen aus 16 Bildern, die alle in der Datei Explosion.png gespeichert sind. In meinem Spiel sind alle Bilder in einem Textur-Atlas-Pack gespeichert.LibGdx Animation mit TextureAtlas

Also zuerst habe ich die Region, die ich aus der Klasse benötigen Assets.java

public class Explosion { 
    public final AtlasRegion explosion; 
    public Explosion (TextureAtlas atlas){ 
     explosion = atlas.findRegion(Constants.EXPLOSION); 
    } 
} 

Dann in meiner Klasse, die die Explosion schaffen, habe ich den folgenden Code:

public Particles(Vector2 position){ 
    this.position = position; 
    startTime = TimeUtils.nanoTime(); 

    Array<TextureRegion> explosionAnimationTexture = new Array<TextureRegion>(); 

    TextureRegion region = Assets.instance.explosion.explosion; 
    Texture explosionTexture = region.getTexture(); 

    int ROW = 4; // rows of sprite sheet image 
    int COLUMN = 4; 
    TextureRegion[][] tmp = TextureRegion.split(explosionTexture, explosionTexture.getWidth()/COLUMN, explosionTexture.getHeight()/ROW); 
    TextureRegion[] frames = new TextureRegion[ROW * COLUMN]; 
    int elementIndex = 0; 
    for (int i = 0; i < ROW; i++) { 
     for (int j = 0; j < COLUMN; j++) { 
      explosionAnimationTexture.add(tmp[i][j]); 
      frames[elementIndex++] = tmp[i][j]; 
     } 
    } 

    explosion = new Animation(EXPLOSION_FRAME_DURATION,explosionAnimationTexture , Animation.PlayMode.LOOP_PINGPONG); 
} 

I verwende 4x4, da ich 16 Frames habe. Und in der Render-Methode bekam ich folgende:

public void render(SpriteBatch batch){ 
    float elapsedTime = MathUtils.nanoToSec * (TimeUtils.nanoTime() - startTime); 
    TextureRegion walkLoopTexture = explosion.getKeyFrame(elapsedTime); 

    batch.draw(
      walkLoopTexture.getTexture(), 
      position.x, 
      position.y, 
      0, 
      0, 
      walkLoopTexture.getRegionWidth(), 
      walkLoopTexture.getRegionHeight(), 
      0.3f, 
      0.3f, 
      0, 
      walkLoopTexture.getRegionX(), 
      walkLoopTexture.getRegionY(), 
      walkLoopTexture.getRegionWidth(), 
      walkLoopTexture.getRegionHeight(), 
      false, 
      false); 

} 

Die Animation funktioniert, aber die Bilder aus der gesamten Atlas-Datei geladen werden, und nicht nur Explosion.png angegeben, wie in Schritt 1.

+0

Sie müssen Animation verwenden und fügen Sie die einzelnen Frames dazu AFAIK –

+0

Die region.getTexture() bekommt die gesamte Textur für den Atlas. Sie sollten region.findRegion ("spritesheetname") verwenden, um nur die Region für den Namen zu erhalten. – dfour

+0

@dfour Ich mache das schon in einer Unterklasse (explosion = atlas.findRegion (Constants.EXPLOSION);) und hole dann das Ergebnis. –

Antwort

1

-Code in Ihrer Particles Klasse:

TextureRegion region = Assets.instance.explosion.explosion; 
TextureRegion[][] tmp = TextureRegion.split(explosionTexture, explosionTexture.getWidth()/COLUMN, explosionTexture.getHeight()/ROW); 

ersetzen mit:

TextureRegion[][] tmp = region.split(region.getRegionWidth()/COLUMN,region.getRegionHeight()/ROW); 

Und

zeichnen Ihre Animation mit textureRegion statt seiner texture so geeignete Methode wählen Unterschrift SpriteBatch für textureRegion Zeichnung.

+1

Perfect thank you, ich habe mir eine TexturRegion teilen lassen. Danke auch @dfour für die Hilfe –

Verwandte Themen