У меня есть следующий подкласс 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());
}
Благодарим вас, я вижу действия, которые действуют сейчас. Но как насчет масштабных действий? Если я удаляю вызовы getWidth() и getHeight() из моего вызова 'batch.draw', мои Актеры имеют большой размер, поскольку я использую TextureRegion, поэтому все отображается (но, к сожалению, пока не происходит масштабирования). – Wabbitseason
Нашел полное решение: мне пришлось использовать еще более сложную реализацию метода 'draw'. – Wabbitseason