libgdx 中的淡出动作

FadeOut Action in libgdx

我正在尝试为舞台中的所有演员制作动画,但 FadeOut Action 不起作用 尽管其他操作正常

我有以下代码

getRoot().setPosition(Gdx.graphics.getWidth(), 0);
getRoot().getColor().a = 0;
SequenceAction sequenceAction = new SequenceAction();
sequenceAction.addAction(Actions.moveTo(0, 0, 3.0f));
sequenceAction.addAction(Actions.fadeOut(3.0f));
getRoot().addAction(sequenceAction);

我还尝试了另一种方法,使用 class GroupAccessor implements TweenAccessor<Group> 通过 TweenEngine 为它们制作动画,除了操纵 alpha 值

外,其他一切都很好
public class GroupAccessor implements TweenAccessor<Group> {

    public static final int ALPHA = 0;
    public static final int POS_XY = 1;

    @Override
    public int getValues(Group target, int tweenType, float[] returnValues) {
        switch (tweenType) {
            case ALPHA :
                returnValues[0] = target.getColor().a;
                return 1;
            case POS_XY :
                returnValues[0] = target.getX();
                returnValues[1] = target.getY();
                return 2;
            default:
                assert false;
                return -1;
        }
    }

    @Override
    public void setValues(Group target, int tweenType, float[] newValues) {
        switch (tweenType) {
            case ALPHA :
                target.setColor(target.getColor().r, target.getColor().g, target.getColor().b,
                        newValues[0]);
                break;
            case POS_XY :
                target.setPosition(newValues[0], newValues[1]);
                break;
            default:
                assert false;
        }
    }
}

使用 TweenEngine 的动画

Timeline.createSequence().
                push(Tween.set(getRoot(), GroupAccessor.POS_XY).target(Gdx.graphics.getWidth(),0))
                .push(Tween.to(getRoot(), GroupAccessor.POS_XY, 3.0f).target(0,0))
                .push(Tween.set(getRoot(), GroupAccessor.ALPHA).target(0))
                .push(Tween.to(getRoot(), GroupAccessor.ALPHA, 3.0f).target(1)).start(manager);

我有多个演员,我制作了其中一些演员的数组。这是 2 个演员的 draw() 方法的 2 个示例

public void draw(Batch batch, float parentAlpha) {
        batch.draw(wallSprite, 0, 0, Constants.WIDTH, Constants.HEIGHT);
    }

public void draw(Batch batch, float parentAlpha) {
        batch.draw(gearSprite, getX(), getY(),
                gearSprite.getOriginX(), gearSprite.getOriginY(), gearSprite.getWidth(),
                gearSprite.getHeight(), gearSprite.getScaleX(), gearSprite.getScaleY()
                , gearSprite.getRotation());
        try {
            batch.draw(permittedCSprite, getX() + gearSprite.getWidth()/2
                            - permittedCSprite.getWidth()/2, getY() +
                            gearSprite.getHeight()/2 - permittedCSprite.getHeight()/2,
                    permittedCSprite.getWidth(), permittedCSprite.getHeight());
        }
        catch (NullPointerException e) {}
    } 

Actor 的draw 方法绝对必须在Batch 上设置颜色。这是支持衰落所必需的。即使您不关心演员的褪色或颜色改变,您仍然需要将 Batch 的颜色更改为 WHITE 以确保演员是用什么颜色绘制的(因为无法保证其他颜色是什么颜色演员已离开批次。

通常,您会在绘制方法的顶部有这样的内容:

public void draw (Batch batch, float parentAlpha) {
    Color color = getColor();
    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
    //...
}

但是,如果您的 Actor 正在绘制 Sprite 而不是 TextureRegion,则您必须改为在 Sprite 上设置颜色。这是因为精灵有自己的颜色,当您调用 sprite.draw.

时它们会传递给批处理

如果您使用的是 Sprite(我不建议将其与 Actors 一起使用),您的绘制方法应该如下所示:

public void draw (Batch batch, float parentAlpha) {
    sprite.setColor(getColor());
    sprite.draw(batch, parentAlpha);
}

一个"gotcha"是Sprite是TextureRegion的子类。 Sprite 是一个 TextureRegion,它包含有关颜色、大小、方向、位置等的信息,因此它的绘制速度(可能)比 TextureRegion 快一点。它是以使用更多内存为代价的。如果您正在使用 Sprite,您应该调用 sprite.draw 而不是 batch.draw(sprite ...),因为第二个选项将 sprite 视为 TextureRegion。

如果你想使用精灵,那么你需要给精灵应用你需要的所有属性。例如:

public void draw (Batch batch, float parentAlpha) {
    sprite.setColor(getColor());
    sprite.setPosition(getX(), getY());
    sprite.setSize(getWidth(), getHeight());
    //etc. etc. etc. :(
    sprite.draw(batch, parentAlpha);
}

因此,在 Actor 中使用 Sprite 确实没有任何意义。太多的冗余。只需使用 TextureRegions。