Я разрабатываю свой собственный класс 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.clearActions();
) вы очищаете список, поэтому cachedActions
пусто.
Позже, после подкраски, у актера (и cachedActions
) теперь есть действие, которое вы добавили (btnScaleBackActions()
). Вы перебираете массив, постоянно добавляя к нему один и тот же объект. Итератор никогда не может завершиться, потому что вы всегда добавляете больше, так что это бесконечный цикл.
Вам нужно создать свой собственный список для кешированных действий и скопировать элементы.
private final Array<Action> cachedActions = new Array<Action>();
Затем скопируйте действия, а не ссылку в тачдаун:
cachedActions.addAll(actor.getActions());
actor.clearActions();
И не забудьте убрать cachedActions
в конце touchUp
.
Вы должны опубликовать еще один вопрос, чтобы мы могли видеть, как настроены ваши действия.
Пожалуйста, взгляните на мой новый вопрос
Большое спасибо!! Но теперь я получаю нулевое исключение в RepeatAction.delegate и DelegateAction.act при срабатывании touchUp. Не уверен, что это связано с добавление нулевых действий для повторения. Могу ли я узнать, как в этом случае обрабатывать повторяющиеся/навсегда действия?