2

我已经定义了一组动作,并试图将其添加到多个参与者中。这是代码:

        ParallelAction actions = new ParallelAction();

        RotateByAction rotateAction = new RotateByAction();
        rotateAction.setAmount(rotationAmount);

        ScaleByAction scaleAction = new ScaleByAction();
        scaleAction.setAmount(-0.01f);

        DelayAction delayAction = new DelayAction();
        delayAction.setDuration(0.05f);

        RepeatAction rAction = new RepeatAction();
        rAction.setCount(100);

        actions.addAction(rotateAction);
        actions.addAction(scaleAction);
        actions.addAction(delayAction);
        rAction.setAction(actions);



        for(Monster mon : mons) // mons is ArrayList of type Monster (which extends Image)
            mon.addAction(rAction); 

但是上面的逻辑只是将动作添加到我的 ArrayList 中的最后一个actor。为什么我不能对多个演员使用相同的动作?我需要定义与演员一样多的动作,还是有其他方法可以做到这一点?

我在这里查看了 Pool https://code.google.com/p/libgdx/wiki/scene2d我似乎没有掌握它。它对我的问题有用吗?如果是,那么如何?

4

1 回答 1

4

因为所有的 Actor 都具有对一个序列的引用。所以每个有序列的 Actor 都做同样的事情。例如,如果您为 10 个演员使用 1 个 Sprite,并且您确实在 1 个演员中更改了它,那么其他所有演员也都进行了更改。因此,如果您将一个序列添加到 10 个演员,它的速度确实会提高 10 倍,因为.act()来自一个演员的每个演员都会更新序列(因为在每个 actor.act 内部,它确实会在增量时间之前更新所有动作!)。所以你确实用每个演员更新了序列,这就是它不起作用的原因。你需要为每个正确的演员创建​​一个新的序列。只需将您的代码更改为:

for(Monster mon : mons){ // mons is ArrayList of type Monster (which extends Image)
        RotateByAction rotateAction = new RotateByAction();
        rotateAction.setAmount(rotationAmount);

        ScaleByAction scaleAction = new ScaleByAction();
        scaleAction.setAmount(-0.01f);

        DelayAction delayAction = new DelayAction();
        delayAction.setDuration(0.05f);

        RepeatAction rAction = new RepeatAction();
        rAction.setCount(100);

        actions.addAction(rotateAction);
        actions.addAction(scaleAction);
        actions.addAction(delayAction);
        rAction.setAction(actions);
        mon.addAction(rAction); 
}

这在初始化时可能确实需要更长的时间,但它应该可以纠正您的错误。

于 2013-07-25T19:53:16.590 回答