无法循环执行操作。libGDX

5

我大约4天前曾经提过一个问题,得到了一些帮助,现在我的代码看起来像是这样:

ColorAction actionBtG = new ColorAction();
ColorAction actionGtB = new ColorAction();
SequenceAction sequenceAction;
RepeatAction repeatAction = new RepeatAction();
ShapeRenderer shapeRenderer;
Color blue = new Color(Color.BLUE);

@Override
public void create () {

    shapeRenderer = new ShapeRenderer();
    actionBtG.setColor(blue);
    actionBtG.setEndColor(Color.GOLD);
    actionBtG.setDuration(5);

    actionGtB.setColor(blue);
    actionGtB.setEndColor(Color.BLUE);
    actionGtB.setDuration(5);
    sequenceAction = new sequenceAction(actionBtG,actionGtB);






    repeatAction = new RepeatAction():        
    repeatAction.setAction(sequenceAction);
    repeatAction.setCount(RepeatAction.FOREVER);
}

@Override
public void render () {

    repeatAction.act(Gdx.graphics.getDeltaTime());
    Gdx.gl.glClearColor(1,1,1,1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
    shapeRenderer.setColor(blue);
    shapeRenderer.rect(100, 100, 40, 40);
    shapeRenderer.end();


}

但它仍然无法正常工作。它只执行一次并停止。当我需要循环时,从蓝色到金色,然后从金色到蓝色。

我非常感谢任何帮助,因为我正在学习libGDX。谢谢。

我已经阅读了所有答案并编辑了我的代码,但它仍然不起作用:

private Actor actionManager = new Actor();
ColorAction actionBtG = new ColorAction();
ColorAction actionGtB = new ColorAction();
SequenceAction sequenceAction;
RepeatAction repeatAction;
Color activeColor = new Color(Color.BLUE);
ShapeRenderer shapeRenderer;


@Override
public void create () {

    shapeRenderer = new ShapeRenderer();
    actionBtG.setColor(activeColor);
    actionBtG.setEndColor(Color.GOLD);
    actionBtG.setDuration(5);

    actionGtB.setColor(activeColor);
    actionGtB.setEndColor(Color.BLUE);
    actionGtB.setDuration(5);
    sequenceAction = new SequenceAction(actionBtG,actionGtB);
    repeatAction = new RepeatAction();
    repeatAction.setAction(sequenceAction);
    repeatAction.setCount(RepeatAction.FOREVER);

    actionManager.addAction(repeatAction);
}

这里是render()函数

@Override
    public void render () {
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    actionManager.act(Gdx.graphics.getDeltaTime());

    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
    shapeRenderer.setColor(blue);
    shapeRenderer.rect(100, 100, 40, 40);
    shapeRenderer.end();
}

现在它的颜色没有变化,总是蓝色。

1
你在哪里设置 Action 的目标? - asherbret
@user2016436,如果您在ColorActions上使用setColor,则无需设置目标。 - Tenfour04
最好将“blue”重命名为其他名称,因为您不打算让它保持蓝色。 - Tenfour04
你是不是忘记在 shapeRenderer.setColor 中更新颜色名称了,还是上面粘贴的代码中有笔误?我没有看到其他错误。 - Tenfour04
在我的项目中,没问题,我只是复制粘贴了上面的代码两次,并在这里进行了编辑。 - Gtzzy
3个回答

3
你遇到了一个与预期行为Actor有关的错误。许多操作在没有Actor的情况下都可以正常工作,但SequenceAction不行,因为它预计需要附加到一个Actor以检测它是否仍在运行。
因此,一个有点hacky的解决方案是在设置顶层操作时向其添加一个虚拟的actor。这模拟了将操作添加到舞台中的Actor时发生的情况。
repeatAction.setActor(new Actor());

如果您计划在应用程序中使用更多的操作,您可以创建一个单一的Actor来管理所有的操作:
private Actor actionManager = new Actor();

//when creating actions:
actionManager.addAction(repeatAction);

//In render(), use this instead of calling act on individual actions
//It will call act on all actions in the actor:
actionManager.act(Gdx.graphics.getDeltaTime());

当然,如果想要使用一个舞台来绘制东西,您可以简单地将您的操作添加到舞台上,而不是使用演员作为您的操作管理器。

个人认为scene2d Actions比UniversalTweenEngine更易于使用和设置。


我认为libgdx的动作比通用缓动引擎更容易设置,但是如果你的游戏对象并非全部都是libgdx演员,那么你还有其他选择吗?最终,您可能希望实现一些无法使用libgdx动作进行缓动的效果。对于大型项目,似乎不可避免地需要使用通用缓动引擎。 - Barodapride
@Tenfour04根据你在回答的后半部分所说的做了,给问题添加了一些信息。 - Gtzzy
它能够工作,虽然不知道为什么,但它能够工作。我刚刚创建了一个新项目,并手动编写了整个代码,没有复制粘贴。谢谢大家。 - Gtzzy

2
以下示例对我有效(无限旋转)。
方法1:(推荐)
loadingActor.addAction(Actions.repeat(RepeatAction.FOREVER, Actions.rotateBy(360, 1)));

方法二:

Image loadingActor = new Image(AssetsController.getInstance().getLoading());
loadingActor.setOrigin(Align.center);
final SequenceAction infiniteRotate = Actions.sequence();
infiniteRotate.addAction(Actions.rotateTo(0 , 0f) );
infiniteRotate.addAction(Actions.rotateTo(360 , 1f) );
loadingActor.addAction(Actions.forever(infiniteRotate));

0

Libgdx的Actions仅适用于Libgdx Actors。您正在创建一个Action,但没有将其分配给Actor。您只是将shapeRenderer颜色设置为蓝色,忽略了您创建的Action。如果您想随时间改变颜色,我建议使用通用缓动引擎中的缓动。

或者,您可以放弃shapeRenderer并使用Image(Actor子类)。然后,您将您的Action分配给Image。但是,要做到这一点,您必须创建一个舞台并将您的Image添加到舞台中。请参见scene2d wiki

无论哪种方式都需要额外的几个步骤。也许一个简单的方法来轻松地使其工作是:

  1. 创建一个图像:

    Image i = new Image();

  2. 将你的操作分配给图像 i:

    i.addAction(repeatAction);

  3. 用以下代码替换 repeatAction.act(...):

    i.act(Gdx.graphics.getDeltaTime());

  4. 将 shapeRenderer.setColor(blue) 更改为:

    shapeRenderer.setColor(i.getColor());

希望这能帮到你。


1
实际上,由于颜色操作针对的是“蓝色”Color实例,因此形状渲染器确实从操作中读取了正确的变化颜色值。 - Tenfour04
我明白了,对我来说更有趣的是你可以有与演员无关的动作。这似乎非常有用。我不知道这一点。现在我将在各个地方使用可运行的延迟操作。 - Barodapride
我认为这是特定于ColorAction的。请参考我的其他答案。您可以使用虚拟演员作为您的操作管理器。 - Tenfour04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接