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。
我正在尝试为舞台中的所有演员制作动画,但 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。