2016-06-15 3 views
0

Я изучаю libgdx и в настоящее время делаю демоверсию flappy. Для удовольствия я попытался реализовать, когда оценка достигла определенного числа, текстура птичьего спрайта обновится и изменится на другой цвет. Вместо использования spritebatch и изменения цвета с помощью тонирования мне хотелось создать новую текстуру (файл png).Обновление анимации Libgdx

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

Вот моя птица класс:

public class Bird { 

private static final int GRAVITY = -15; 
private static final int MOVEMENT = 100; 
private Vector3 position; 
private Vector3 velocity; 
private Rectangle bounds; 
private Animation birdAnimation; 
private Texture birdTexture; 
private TextureRegion textureRegion; 
private Sound flap; 



public Bird(int x, int y){ 
    position = new Vector3(x, y, 0); 
    velocity = new Vector3(0, 0, 0); 

    textureRegion = new TextureRegion(returnTexture()); 
    birdAnimation = new Animation(textureRegion, 3, 0.5f); 

    bounds = new Rectangle(x, y, returnTexture().getWidth()/3, returnTexture().getHeight()); 
    flap = Gdx.audio.newSound(Gdx.files.internal("sfx_wing.ogg")); 

} 

public void update(float dt){ 
    textureRegion = new TextureRegion(returnTexture()); 
    birdAnimation = new Animation(textureRegion, 3, 0.5f); 

    birdAnimation.update(dt); 

    if(position.y > 0){ 
     velocity.add(0, GRAVITY, 0); 
    } 
    velocity.scl(dt); 
    position.add(MOVEMENT * dt, velocity.y, 0); 
    if(position.y < 0){ 
     position.y = 0; 
    } 

    velocity.scl(1/dt); 
    bounds.setPosition(position.x, position.y); 
} 

public TextureRegion getTexture() { 
    return birdAnimation.getFrame(); 
} 

public Texture returnTexture(){ 
    if(PlayState.score > 1){ 
     return birdTexture = new Texture("birdanimation1.png"); 
    }else{ 
     return birdTexture = new Texture("birdanimation.png"); 

    } 
} 

public Vector3 getPosition() { 
    return position; 
} 

public void jump(){ 
    velocity.y = 250; 
    flap.play(0.15f); 
} 

public Rectangle getBounds(){ 
    return bounds; 
} 

public void dispose(){ 
    returnTexture().dispose(); 
    flap.dispose(); 
} 

}

Вот моя анимация класс:

public class Animation { 
private Array<TextureRegion> frames; 
private float maxFrameTime; 
private float currentFrameTime; 
private int frameCount; 
private int frame; 

public Animation(TextureRegion region, int frameCount, float cycleTime){ 
    frames = new Array<TextureRegion>(); 
    int frameWidth = region.getRegionWidth()/frameCount; 
    for(int i = 0; i < frameCount; i++){ 
     frames.add(new TextureRegion(region, i * frameWidth, 0, frameWidth, region.getRegionHeight())); 
    } 
    this.frameCount = frameCount; 
    maxFrameTime = cycleTime/frameCount; 
    frame = 0; 
} 

public void update(float dt){ 
    currentFrameTime += dt; 
    if(currentFrameTime > maxFrameTime){ 
     frame++; 
     currentFrameTime = 0; 
    } 
    if(frame >= frameCount){ 
     frame = 0; 
    } 
} 

public TextureRegion getFrame(){ 
    return frames.get(frame); 
} 

}

Вот моя визуализация коды в моей пьесе состоянии:

@Override 
public void render(SpriteBatch sb) { 
    sb.setProjectionMatrix(cam.combined); 
    sb.begin(); 
    sb.draw(bg, cam.position.x - (cam.viewportWidth /2), 0); 
    sb.draw(bird.getTexture(), bird.getPosition().x, bird.getPosition().y); 
    for(Tube tube : tubes){ 
     sb.draw(tube.getTopTube(), tube.getPosTopTube().x, tube.getPosTopTube().y); 
     sb.draw(tube.getBottomTube(), tube.getPosBotTube().x, tube.getPosBotTube().y); 
    } 
    sb.draw(ground, groundPos1.x, groundPos1.y); 
    sb.draw(ground, groundPos2.x, groundPos2.y); 
    font.draw(sb, text, cam.position.x - gl.width/2, cam.position.y + 200); 
    sb.end(); 
} 

Если вам нужны другие классы, просто спросите. Я, вероятно, делаю глупую ошибку или просто неправильно ее кодирую за то, чего я пытаюсь достичь.

Спасибо, Джексон

+0

Можете ли вы опубликовать код цикла визуализации? –

+0

Почему вы создаете новый объект «Анимация» при каждом обновлении. Это ужасная идея. – Zac

+0

Я знаю его плохую идею, и именно поэтому я спрашиваю. Я делаю это так, чтобы птица действительно меняла текстуры. @Zac –

ответ

0

Вам нужно НЕ загружать текстуры каждый кадр. libgdx имеет свой собственный класс анимации, поэтому вам не нужно создавать свои собственные.

Вот пример на анимации из GitHub libgdx в: 2D Animation

Чтобы сделать это просто, есть 2 animaitons на птице и переключаться между ними, когда вам нужно.

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