如何临时从演员那里取出动作并将其分配回来
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
。
我正在设计自己的 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
。