如何临时从演员那里取出动作并将其分配回来

How to temporary take out actions from actor and assign it back

我正在设计自己的 clickListener class。当我触及在我的 clicklistener 中注册的任何演员时,我想暂停演员的所有动作,并且只有在触发触摸时才将其回调。我尝试使用以下代码,但每次触发 touchUp 时都会让我完全挂起。

public class MyClickListener extends ClickListener {

    public Actor actor;
    Array<Action> cachedActions;

    @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 a: cachedActions)
        {
            a.reset();
            a.setTarget(actor); 
            a.setActor(actor);
            actor.addAction(a); //this line give me a total hang
        }
    }

    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
        if(pointer==0) // avoid further trigger on other buttons while holding the selected actor
        {
            actor = event.getListenerActor();
            actor.setScale(0.9f);
            cachedActions = actor.getActions();
            actor.clearActions();
            if(autoSetSound)AudioManager.playSound(AudioManager.CLICK_IN);
            return super.touchDown(event, x, y, pointer, button);
        }
        else
        {
            return false;
        }
    }

    public static Action btnScaleBackActions(){
        float time = 0.1f;
        return sequence(
                scaleTo(1,1,time ),
                scaleTo(0.95f,0.95f,time/4),
                scaleTo(1,1,time/4)
        );
    }
}

没有错误,只是白屏。有帮助吗?

问题出在这一行:

cachedActions = actor.getActions();

您正在获取对 Actor 自己的动作列表的引用,而不是制作副本。顺便说一句,在下一行 (actor.clearActions();) 中,您正在清除列表,因此 cachedActions 为空。

稍后进行修饰,演员(和 cachedActions)现在具有您添加的动作 (btnScaleBackActions())。您正在循环遍历一个数组,永远向其中添加相同的对象。迭代器永远无法完成,因为你总是在添加更多,所以它是一个无限循环。

您需要为缓存操作创建自己的列表并将项目复制过来。

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

然后复制动作,而不是touch down中的参考:

cachedActions.addAll(actor.getActions());
actor.clearActions();

并确保清除 touchUp 末尾的 cachedActions