【问题标题】:Cannot loop an action. libGDX无法循环操作。库GDX
【发布时间】:2016-04-11 06:48:14
【问题描述】:

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

这里是渲染()

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

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

【问题讨论】:

  • set the targetAction 在哪里?
  • @user2016436 如果您在 ColorActions 上使用 setColor,则它们不需要目标。
  • 最好将blue 重命名为其他名称,因为您不打算让它保持蓝色。
  • 您是否忘记更新shapeRenderer.setColor 中的颜色名称,或者这只是您在上面粘贴的代码中的拼写错误?我没有看到任何其他错误。
  • 在我的项目中 - 没关系,我只是将上面的代码复制粘贴了两次并在此处进行了编辑。

标签: java android libgdx scene2d


【解决方案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));

【讨论】:

    【解决方案2】:

    您遇到了与期望与 Actor 一起使用的 Action 相关的错误。很多 Action 在没有 Actor 的情况下也能正常工作,但 SequenceAction 却不行,因为它希望附加到 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());
    

    当然,如果您想使用 Stage 来绘制东西,您可以简单地将您的动作添加到 Stage,而不是使用 Actor 作为您的动作管理器。

    我个人认为,scene2d 动作必须比 UniversalTweenEngine 更易于使用和设置。

    【讨论】:

    • 我也认为 libgdx 动作比通用 Tween 引擎更容易设置,但是如果您的游戏对象不是所有 libgdx 演员,您还有什么其他选择?最终,您可能想要对无法使用 libgdx 操作进行补间的内容进行补间。对于大型项目,您似乎不可避免地会想要使用通用补间引擎。
    • @Tenfour04 确实像你在回答的后半部分所说的那样,在问题中添加了一些信息。
    • 它工作,不知道如何,但它工作。我刚刚创建了一个新项目并手动编写了整个代码,无需复制粘贴。谢谢大家。
    【解决方案3】:

    Libgdx Actions 仅适用于 Libgdx Actors。您正在创建一个动作,但没有将它分配给一个 Actor。您只是将 shapeRenderer 颜色设置为蓝色,而忽略了您创建的操作。如果您想随着时间的推移更改颜色,我建议您使用来自Universal tween engine 的补间。

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

    无论哪种方式都需要一些额外的步骤。让这项工作轻松进行的廉价黑客可能是:

    1. 只需创建一个图像:

      图像 i = new Image();

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

      i.addAction(repeatAction);

    3. 将 repeatAction.act(...) 替换为

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

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

      shapeRenderer.setColor(i.getColor());

    希望对您有所帮助。

    【讨论】:

    • 实际上,由于颜色动作针对的是blue Color 实例,所以形状渲染器确实从动作中读取了正确的变化颜色值。
    • 我明白了,对我来说更有趣的是你可以拥有与演员无关的动作。这似乎真的很有用。我不知道。现在我将在所有地方使用可运行的延迟操作。
    • 我认为它是 ColorAction 特有的。请参阅我的另一个答案。您可以使用虚拟演员作为您的操作管理器。
    猜你喜欢
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 2013-08-15
    • 2012-06-01
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多