Как временно убрать действия у актера и вернуть его обратно - PullRequest
1 голос
/ 30 мая 2019

Я создаю свой собственный класс 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)
        );
    }
}

Он не показывает ошибки, но только белый экран.Любая помощь?

1 Ответ

2 голосов
/ 30 мая 2019

Проблема в этой строке:

cachedActions = actor.getActions();

Вы получаете ссылку на собственный список действий Актера вместо того, чтобы делать копию. Кстати, в следующей строке (actor.clearActions();) вы очищаете список, поэтому cachedActions пусто.

Позже подправим, у актера (и cachedActions) теперь есть добавленное вами действие (btnScaleBackActions()). Вы перебираете массив, добавляя к нему один и тот же объект навсегда. Итератор никогда не может завершиться, потому что вы всегда добавляете больше, так что это бесконечный цикл.

Вам необходимо создать собственный список для кэшированных действий и скопировать элементы поверх.

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

Затем скопируйте действия, а не ссылку на контакт:

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

И обязательно очистите cachedActions в конце touchUp.

...