2015-07-08 2 views
1

Я сейчас пытаюсь использовать свой лист анимации в классе игроков, но у меня есть некоторые сомнения в моей ситуации. Я следил за документацией (https://github.com/libgdx/libgdx/wiki/2D-Animation), где рассказывается о анимации 2d, но она просто показывает анимацию одного типа, в этом случае - анимацию прогулок. Мой контекст отличается, у меня есть 3 типа анимации: бездействующий, бегущий и лазающий. Интересно, возможно ли удержать все типы анимации в уникальном объекте Animation или я должен создать по 3 объекта для каждого? Я также пытаюсь найти что-то равное в stackoverflow и google, но я ничего не нашел.Несколько анимаций в один объект Анимация

Это то, что я сделал с моим частным методом loadAnimations():

private void loadAnimations() { 
    // Get the player animations sheet 
    Texture playerSheet = Assets.manager.get(Assets.playersheet); 

    // List of texture regions that hold the animations 
    TextureRegion[][] tmp = TextureRegion.split(playerSheet, playerSheet.getWidth()/PLAYER_FRAME_COLS, playerSheet.getHeight()/PLAYER_FRAME_ROWS); 

    // Put all textures from texture region to 1-d texture region 
    int index = 0; 
    TextureRegion[] walkFrames = new TextureRegion[PLAYER_FRAME_COLS * PLAYER_FRAME_ROWS]; 
    for (int i = 0; i < PLAYER_FRAME_ROWS; i++) { 
     for (int j = 0; j < PLAYER_FRAME_COLS; j++) { 
      walkFrames[index++] = tmp[i][j]; 
     } 
    } 
    this.runAnimation = new Animation(FRAMES_DURTION, walkFrames); 
} 

И это propriétés игрока:

private Animation idleAnimation, runAnimation, climbAnimation; 
private TextureRegion currentFrame; 

Что делать в этом случае? Спасибо.

ответ

1

Чтобы воспользоваться преимуществами методов в классе анимации, я бы, вероятно, создал 3 отдельных объекта анимации, по одному для каждого «состояния» (простоя, запуска, набора высоты). Код, который у вас есть (и в учебнике), загружает текстуры анимации для одного из ваших состояний. Поэтому вам нужно будет сделать что-то подобное со всеми тремя анимационными текстурами анимации, чтобы создать 3 разных объекта анимации.

Затем в вашем методе визуализации, в зависимости от того, в каком «состоянии» присутствует ваш персонаж, вы выбираете анимацию для рендеринга.

ех, в ниже, линия

currentFrame = walkAnimation.getKeyFrame(stateTime, true); 

бы там, где вы выбираете, какой анимация (idleAnimation, runAnimation, climbAnimation) вы бы вынести на основе того, что делает ваш персонаж. (Вам также может понадобиться играть со значениями stateTime при переключении между анимациями), но, надеюсь, вы понимаете, что я предлагаю.

@Override 
    public void render() { 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);       
     stateTime += Gdx.graphics.getDeltaTime();   
     currentFrame = walkAnimation.getKeyFrame(stateTime, true); 
     spriteBatch.begin(); 
     spriteBatch.draw(currentFrame, 50, 50);    
     spriteBatch.end(); 
    } 
0

Я решил свою проблему. В принципе я это сделал:

Это мои переменные для анимации:

// Player Animations 
public static int PLAYER_FRAME_ROWS = 3; 
public static int PLAYER_FRAME_COLS = 4; 
public static float FRAMES_DURTION = 0.13f; 
public static enum ANIMATIONS_INDEX {IDLE, RUNNING, CLIMBING}; 
private Animation animations[]; 
private TextureRegion currentFrame; 
private float stateTime, currentFrameDuration; 
private int animationIndex; 

И здесь, на функции loadAnimations() Я сделал это:

private void loadAnimations() { 
    // Instance the number of types of animations 
    this.animations = new Animation[ANIMATIONS_INDEX.values().length]; 

    // Get the player animations sheet 
    Texture playerSheet = Assets.manager.get(Assets.playersheet); 

    // List of texture regions that hold the animations 
    TextureRegion[][] tmp = TextureRegion.split(playerSheet, playerSheet.getWidth()/PLAYER_FRAME_COLS, playerSheet.getHeight()/PLAYER_FRAME_ROWS); 

    // Set the textures regions for each animation index 
    for (int i = 0; i < ANIMATIONS_INDEX.values().length; i++) { 
     this.animations[i] = new Animation(FRAMES_DURTION, tmp[i]); 
    } 

    // Set player bounds 
    this.setBounds(this.getX(), this.getY(), playerSheet.getWidth()/PLAYER_FRAME_COLS, playerSheet.getHeight()/PLAYER_FRAME_ROWS); 

    // Set state time to zero 
    this.stateTime = 0; 
} 
Смежные вопросы