AS3 удалить анимацию перед MOTION_FINISH через мувиклип - PullRequest
2 голосов
/ 17 декабря 2011

Я немного возился с этой проблемой. У меня есть симпатичная небольшая подсказка для мувиклипа, которая следует за мышью пользователя в течение нескольких секунд, прежде чем она сама себя удалит. Моя проблема в том, что, если он уже есть, я удаляю его, но я не могу удалить событие MOTION_FINISH, и оно все равно срабатывает и, возможно, удаляет новую подсказку.

То, что я хочу, это, по сути, поместить в позицию, например, var tween (smallhelp_panel) .deleteAll (); Я видел твинлайт-функцию killtweensof (mc); Однако я использовал твины, которые я включил ниже, в свои 30 тыс. Строк кода AS3.

Вот мой обработчик всплывающей подсказки. Я называю это простым

Main_Warning("Please don't forget to save!",5);

Мой мувиклип - smallhelp_panel, и я проверяю, существует ли он уже, и удаляю его. Однако альфа-анимация и анимация MOTION_FINISH все еще существуют и вызывают проблемы с любыми новыми smallhelp_panels.

public function Main_Warning( the_text:String, myTimer:int = 4){
        if(smallhelp_panel != null){
                stage.removeChild( smallhelp_panel );
                removeEventListener(Event.ENTER_FRAME, trackmouse);
                smallhelp_panel = null;
            }
        smallhelp_panel = new small_help();
        smallhelp_panel.name = "myWarning";
        smallhelp_panel.x = mouseX - 50;
        smallhelp_panel.y = mouseY + 15;
        smallhelp_panel.helptext.text = the_text;
        stage.addChild( smallhelp_panel );
        addEventListener(Event.ENTER_FRAME, trackmouse);
        var myTween:Tween;

        myTween = new Tween(smallhelp_panel, "alpha", None.easeOut, 1, 0, myTimer, true);
        tweenholder = myTween;
        tweenArray.push(tweenholder);
        myTween.addEventListener(TweenEvent.MOTION_FINISH, removeTween);
    }

Это мой обработчик подсказок.

в справочных целях мой съемник твина:

public function removeTween(e:TweenEvent = null):void{
        e.target.removeEventListener(TweenEvent.MOTION_FINISH, removeTween);
        if(smallhelp_panel != null){
            removeEventListener(Event.ENTER_FRAME, trackmouse);
            stage.removeChild( smallhelp_panel );
            smallhelp_panel = null;
        }
    }

и мой трекер мыши, который перемещает всплывающую подсказку с помощью мыши, прост:

public function trackmouse(e:Event):void{
        smallhelp_panel.x = mouseX - 50;
        smallhelp_panel.y = mouseY + 15;
    }

Ответы [ 2 ]

0 голосов
/ 17 декабря 2011

Ваш TweenEvent все еще прослушивается.Вы никогда не удаляете предыдущего слушателя, поэтому он будет срабатывать, когда вычисления анимации завершены.

Я предполагаю, что tweenholder объявлен где-то глобально?(Как и другой ответ здесь, я запутался в том, что вам нужно объявить новую анимацию движения, сохранить ее в другой ссылке и добавить эту ссылку в массив ...) Если это так, попробуйте следующее:

public function Main_Warning( the_text:String, myTimer:int = 4){
    tweenholder.removeEventListener(TweenEvent.MOTION_FINISH,removeTween); 
    if(smallhelp_panel != null){
        ...
0 голосов
/ 17 декабря 2011

Это потому, что вы добавили прослушиватель событий MOTION_FINISH к анимации движения, а не к панели.Вы удаляете панель, если она уже существует, но анимация по-прежнему существует в переменных tweenholder и tweenArray - и запускает событие MOTION_FINISH, когда ее вычисления завершены.Ваш метод прослушивателя событий не знает, из какого события произошла авария, и корректно удаляет панель справки.

Чтобы это исправить, удалите обработчик событий и анимацию вместе с панелью справки в функции Main_Warning илиизмените блок удаления в методе прослушивания событий:

public function removeTween(e:TweenEvent = null):void{
    e.target.removeEventListener(TweenEvent.MOTION_FINISH, removeTween);
    // --- this will check if the Tween belongs to the panel on the stage!
    if (smallhelp_panel && e.target.obj == smallhelp_panel ) { 
    // ---
        removeEventListener(Event.ENTER_FRAME, trackmouse);
        stage.removeChild( smallhelp_panel );
        smallhelp_panel = null;
    }
    // --- NOW remove the tween from the array (all of them should be removed after use)
    tweenArray.splice (tweenArray.indexOf (e.target), 1); 
}

Я не совсем понимаю, зачем вам нужны переменная tweenholder и tweenArray;)

...