2016-08-18 5 views
1

У меня есть следующий подкласс LibGDX Actor, который, кажется, не выполняет никакого визуального действия, но он выполняет задерживаемые runnables (я могу видеть все сообщения Gdx.app.log после ожидаемых задержек) ,LibGDX Актер не будет рисовать Действия

Я звоню super.act(delta) в моем переопределен TileActor.act метод, и я также призываю stage.act(); stage.draw() в Stage классе.

Эти актеры отображаются правильно, поэтому единственная недостающая вещь - это визуальные действия для масштабирования/замирания.

Как я могу отладить это?

class TileActor extends Actor { 
    private TileLogic logic; 
    private boolean flipped; 
    private enum AnimationState { 
    IDLE, 
    SCHEDULED, 
    PROGRESS, 
    COMPLETED 
    } 
    private AnimationState flippedAnimation; 

    private float FLIP_DURATION = 1.05f; 

    TileActor(TileLogic logic, BoardRenderer renderer) { 
    this.logic = logic; 
    flipped = logic.isFlipped(); 
    flippedAnimation = AnimationState.IDLE; 
    column = logic.column; 
    row = logic.row; 
    } 

    void place() { 
    setPosition(calculateX(logic.column), calculateY(logic.row)); 
    } 

    private float calculateX(int column) { 
    return column * (getWidth() + renderer.TILE_GAP) + renderer.boardXPosition; 
    } 

    private float calculateY(int row) { 
    return (renderer.manager.rows - row - 1) * (getHeight() + renderer.TILE_GAP) + renderer.boardYPosition; 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
    batch.draw(flipped ? front : back, calculateX(logic.column), calculateY(logic.row), getWidth(), getHeight()); 
    } 

    @Override 
    public void act(float delta) { 
    super.act(delta); 
    if (flippedAnimation == AnimationState.IDLE && flipped != logic.isFlipped()) { 
     flippedAnimation = AnimationState.SCHEDULED; 
    } 
    if (flippedAnimation == AnimationState.SCHEDULED) { 
     playFlipAnimation(); 
    } 
    if (flippedAnimation == AnimationState.COMPLETED) { 
     flippedAnimation = AnimationState.IDLE; 
     Gdx.app.log("TileActor.act", logic.value + (flippedAnimation.name())); 
    } 
    } 

    private void playFlipAnimation() { 
    flippedAnimation = AnimationState.PROGRESS; 
    Gdx.app.log("TileActor.playFlipAnimation", logic.value + (flippedAnimation.name())); 
    addAction(sequence(
     parallel(// This does not happen, at least I can see no scale or fade animation 
     scaleTo(1, 0, FLIP_DURATION, Interpolation.pow5), 
     fadeOut(FLIP_DURATION, Interpolation.pow5) 
    ), 
     new Action() {// This is executed as expected, I can see the log message 
     @Override 
     public boolean act(float delta) { 
      flipped = logic.isFlipped(); 
      Gdx.app.log("TileActor.playFlipAnimation", logic.value + (flipped ? " " : " NOT ") + " flipped"); 
      return true; 
     } 
     }, 
     parallel(// This does not happen, at least I can see no scale or fade animation 
     scaleTo(1, 1, FLIP_DURATION, Interpolation.pow5), 
     fadeIn(FLIP_DURATION, Interpolation.pow5) 
    ), 
     new Action() {// This is executed as expected, I can see the log message after the delay 
     @Override 
     public boolean act(float delta) { 
      flippedAnimation = AnimationState.COMPLETED; 
      Gdx.app.log("TileActor.playFlipAnimation", logic.value + (flippedAnimation.name())); 
      return true; 
     } 
     } 
    )); 
    } 
} 

Решение:

Мой draw метод должен обрабатывать изменения цвета и передать значения масштаба, а также, как это:

@Override 
public void draw(Batch batch, float parentAlpha) { 
    final Color color = getColor(); 
    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
    batch.draw(flipped ? front : back, 
    calculateX(logic.column), calculateY(logic.row), 
    getOriginX(), getOriginY(), 
    getWidth(), getHeight(), 
    getScaleX(), getScaleY(), 
    getRotation()); 
} 

ответ

1

FadeActions и ColorActions изменить цвет объекта актера. При рисовании вы должны применить этот цвет к партии.

@Override 
public void draw(Batch batch, float parentAlpha) { 
    Color color = getColor(); 
    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
    batch.draw(flipped ? front : back, calculateX(logic.column), calculateY(logic.row), getWidth(), getHeight()); 
} 
+0

Благодарим вас, я вижу действия, которые действуют сейчас. Но как насчет масштабных действий? Если я удаляю вызовы getWidth() и getHeight() из моего вызова 'batch.draw', мои Актеры имеют большой размер, поскольку я использую TextureRegion, поэтому все отображается (но, к сожалению, пока не происходит масштабирования). – Wabbitseason

+0

Нашел полное решение: мне пришлось использовать еще более сложную реализацию метода 'draw'. – Wabbitseason

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

  • Нет связанных вопросов^_^