【问题标题】:FadeOut Action in libgdxlibgdx 中的淡出操作
【发布时间】:2016-07-18 12:09:07
【问题描述】:

我正在尝试为舞台中的所有演员设置动画,但 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);

我还尝试了另一种方法,通过 TweenEngine 使用 class GroupAccessor implements TweenAccessor<Group> 为它们设置动画,除了操作 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 方法。
  • 问题已编辑。

标签: android libgdx tween scene2d


【解决方案1】:

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

通常,你会在你的 draw 方法的顶部有这样的东西:

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

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

如果要使用 Sprite,则需要将所需的所有属性应用于 sprite。例如:

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。

【讨论】:

  • 我使用精灵是因为我想通过补间引擎对这些精灵进行效果,并且我希望所有精灵都在一个演员中,所以我使用精灵而不是纹理区域
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多