java - 如何从cachedActions Libgdx继续序列/并行操作

标签 java libgdx

我有一个 clicklistener 扩展类,其目的是在 touchDown 期间缓存 actor 的任何当前操作,并在触发 touchUp 时将其分配回来。但是,它不适用于顺序或并行操作。

public class MyClickListener extends ClickListener {

    public Actor actor;
    private final Array<Action> cachedActions = new Array<Action>();

    @Override
    public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
        super.touchUp(event, x, y, pointer, button);
        actor = event.getListenerActor();
        actor.addAction(btnScaleBackActions());
        for(Action action:cachedActions)
        {
            //action.reset(); // i wants the actor to continue at where it stop
            action.setTarget(actor);
            action.setActor(actor);
            actor.addAction(action);
        }
        cachedActions.clear();
    }

    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
        if(pointer==0)
        {
            actor = event.getListenerActor();
            actor.setScale(0.9f);
            cachedActions.addAll(actor.getActions());
            actor.clearActions();
            return super.touchDown(event, x, y, pointer, button);
        }
        else
        {
            return false;
        }
    }

我的按钮测试:

// button touchUp continue its previous action at where it stop
btn1.addAction(Actions.scaleBy(1,1,3));

// button touchUp not continue it previous actions and complete stop
btn2.addAction(sequence(Actions.scaleBy(1,1,3))); 

// button touchUp give nullException error
btn3.addAction(forever(Actions.scaleBy(1,1,3)));

//error :
Exception in thread "LWJGL Application" java.lang.NullPointerException
        at com.badlogic.gdx.scenes.scene2d.actions.RepeatAction.delegate(RepeatAction.java:29)
        at com.badlogic.gdx.scenes.scene2d.actions.DelegateAction.act(DelegateAction.java:43)

是否可以在 myClickListener 类停止处继续序列/并行操作?

最佳答案

这是一个替代想法。您可以将操作包装在一种新型的可暂停操作中,而不是处理删除和恢复操作以及随后处理池问题。

public class PausableAction extends DelegateAction {

    public static PausableAction pausable(Action wrappedAction){
        PausableAction action = Actions.action(PausableAction.class);
        action.setAction(wrappedAction);
        return action;
    }

    boolean paused = false;

    public void pause (){
        paused = true;
    }

    public void unpause (){
        paused = false;
    }

    protected boolean delegate (float delta){
        if (paused)
            return false;
        return action.act(delta);
    }

    public void restart () {
        super.restart();
        paused = false;
    }
}

现在,在获取操作时,将它们包装在可暂停的内容中,例如:

btn1.addAction(PausableAction.pausable(Actions.scaleBy(1,1,3)));

并在需要时暂停/取消暂停操作,例如:

//...
actor = event.getListenerActor();
actor.setScale(0.9f);
for (Action action : actor.getActions())
    if (action instanceof PausableAction)
        ((PausableAction)action).pause();
return super.touchDown(event, x, y, pointer, button);

关于java - 如何从cachedActions Libgdx继续序列/并行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56390264/

相关文章:

java - 是否有 libgdx 的 3D 场景图实现?

Java - 无法启动的用户输入(Eclipse)

java - ant-contrib:过时的问题

java - 重新启动应用程序刽子手

java - Libgdx - 如何旋转 3d 粒子的发射轨迹

android - 如何解决java.lang.IllegalArgumentException : Error compiling shader in Android Libgdx project?

java - 更改内容 View

java - Lucene 查询提升

java - 如何更改 libgdx 不同的窗口大小?

java - 为什么相机移动时纹理会闪烁?