【问题标题】:Pause and continue playing an action on actor in Libgdx暂停并继续在 Libgdx 中对演员执行动作
【发布时间】:2018-01-21 12:56:18
【问题描述】:

我正在试用 Libgdx。 这就是我想要达到的目标,

在 Actor 上定义一个动作,当 Actor 执行该动作时,在单击按钮时,我们应该能够从同一位置开始和停止该动作。

我尝试了这个stackoverflow answer,但在再次开始动作后,演员的动作比之前更快,因为最初我们设置了动作完成的持续时间,并且由于剩下的时间更少,它运行得更快。

你能帮忙吗?我错过了什么吗?

【问题讨论】:

  • 顺便说一句,演员不应该移动得更快。只有当您多次添加相同的操作时,它才会移动得更快。无论如何,如果你分享你的代码,帮助你会容易得多。

标签: java libgdx


【解决方案1】:

尝试直接从Actor#actions 数组中删除参与者点击时的动作,然后在另一次点击时将其添加回来。示例:

final Actor actor = // ... initialize your actor;
final Action action = Actions.forever(Actions.rotateBy(360f, 3f, Interpolation.bounceOut));
actor.addAction(action);

actor.addListener(new ClickListener() {
    @Override
    public void clicked(InputEvent event, float x, float y) {
        Array<Action> actions = actor.getActions();
        if (actions.contains(action, true)) {
            // removing an action with Actor#removeAction(Action) method will reset the action,
            // we don't want that, so we delete it directly from the actions array
            actions.removeValue(action, true);
        } else {
            actor.addAction(action);
        }

    }
});

【讨论】:

  • 挑战在于持续时间。我们是否需要根据剩余路径再次计算它?以及如何确定剩余路径。
  • 不,它将完全从暂停的状态恢复。无需进行额外的数学运算。
  • 我试过这个,但这在我的情况下不起作用,它可能在你的情况下起作用,因为旋转是一种幂等操作,即你可以从你停止的地方开始,它看起来一样,但是如果从 a 移动到 b,如果您在某个点 x(a 和 b 之间)删除操作,现在如果您重新应用该操作,它可能不起作用,有什么想法吗?你能试试SequenceAction(Action.moveTo(100,100,10), Action.moveTo(500,500,10))
  • 你的意思是Actions.sequence( Actions.moveTo(100,100,10), Actions.moveTo(500,500,10)) 吗?无论如何,我试过了,效果很好。你有没有像我的例子一样尝试过?正如我所指出的,重要的是不要使用actor.removeAction(),因为那会调用action.reset()。示例中的方式避免了这种情况,并且操作以相同的状态恢复,无论操作是否是幂等的。
  • 至少,如果您在移除动作时不以其他方式更改演员的位置,那么这种方法应该可以按预期工作。
猜你喜欢
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多