【问题标题】:LibGDX Actor won't draw ActionsLibGDX Actor 不会绘制动作
【发布时间】:2016-12-25 23:37:19
【问题描述】:

我有以下 LibGDX Actor 子类,它似乎不执行任何视觉动作,但它执行延迟的可运行项(我可以在预期的延迟之后看到所有 Gdx.app.log 消息)。

我在重写的TileActor.act 方法中调用super.act(delta),我也在Stage 类中调用stage.act(); stage.draw()

这些actors显示正确,所以唯一缺少的是缩放/淡入淡出的视觉动作。

如何调试?

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());
}

【问题讨论】:

    标签: java libgdx scene2d


    【解决方案1】:

    FadeActions 和 ColorActions 修改 Actor 的 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());
    }
    

    【讨论】:

    • 谢谢,我现在可以看到淡入淡出动作了。但是规模行动呢?如果我从我的 batch.draw 调用中删除 getWidth() 和 getHeight() 调用,我的 Actor 会过大,因为我使用的是 TextureRegion,所以一切都显示出来了(但不幸的是,仍然没有发生缩放)。
    • 找到了完整的解决方案:我不得不使用更详细的draw 方法实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多