2016-08-18 41 views
1

我有以下LibGDX Actor子類,它似乎沒有執行任何可視化操作,但它執行延遲的可運行列表(我可以在預期延遲後看到所有的Gdx.app.log消息) 。LibGDX Actor不會繪製操作

我打電話我重寫TileActor.act方法super.act(delta),而我也在Stage類調​​用stage.act(); stage.draw()

這些演員顯示正確,所以唯一缺少的是縮放/褪色的視覺動作。

我該如何調試?

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修改演員的Color對象。繪圖時必須將此顏色應用於批處理。

@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

謝謝,我現在可以看到淡入淡出的操作。但是規模行爲呢?如果我從我的'batch.draw'調用中刪除getWidth()和getHeight()調用,我的Actor就會過大,因爲我使用的是TextureRegion,因此所有內容都顯示(但不幸的是,仍然沒有縮放)。 – Wabbitseason

+0

找到完整的解決方案:我不得不使用更詳細的'draw'方法實現。 – Wabbitseason