Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как правильно удалить мувик с выполняющимся внутри Tween'ом? (http://www.flasher.ru/forum/showthread.php?t=144141)

mooncar 04.09.2010 02:50

Как правильно удалить мувик с выполняющимся внутри Tween'ом?
 
В силу недостаточного знания теории столкнулся с непониманием одной детали работы класса Tween.

Допустим у нас есть (например создали) мувик mc.
В нем создали новый Tween.
В какой-то мемент понадобилось удалить mc.
При этом tween продолжает работать как ни в чем ни бывало, хотя объект-родитель уже отсутствует на сцене.
(В случае моего проекта это приводит к краху ролика).

Код для примера:

Код AS1/AS2:

import mx.transitions.Tween;
var SteO:Object = mx.transitions.easing.Strong.easeOut;
var mc:MovieClip = this.createEmptyMovieClip('mc', 0);
 
mc.tw = new Tween(mc, null, SteO, null, null, 30, true);       
mc.tw.onMotionChanged = function  ()
{
        trace('time: ' + this.time + '  object:  ' + this.obj); //выводит время tween'а и ссылку на объект, который tween'ится
};
 
 
btn.onRelease = function ()
{
        trace(mc.tw);
        mc.removeMovieClip();
        trace(mc.tw);               
};

btn - тестовая рисованная кнопка для удаления и вспомогательных трейсов

1. Нажимаем кнопку, удаляем мувик.
Но tween продолжает работу:
Код:

time: 0.035  object:  _level0.mc
time: 0.125  object:  _level0.mc
time: 0.215  object:  _level0.mc
time: 0.304  object:  _level0.mc
time: 0.387  object:  _level0.mc
time: 0.476  object:  _level0.mc
time: 0.564  object:  _level0.mc
[Tween] //момент нажатия
undefined //после удаления мувика-родителя
time: 0.652  object: 
time: 0.74  object: 
time: 0.828  object: 
time: 0.911  object:

Видно, что в качестве obj трейсится "ничто", даже не undefined.

2. Если перед удалением сделать остановку tween, то все в порядке:
Код AS1/AS2:

btn.onRelease = function () 
{
        trace(mc.tw);
        mc.tw.stop();
        mc.removeMovieClip();
        trace(mc.tw);       
};

Код:

time: 0.033  object:  _level0.mc
time: 0.119  object:  _level0.mc
time: 0.207  object:  _level0.mc
time: 0.295  object:  _level0.mc
time: 0.383  object:  _level0.mc
time: 0.468  object:  _level0.mc
time: 0.556  object:  _level0.mc
[Tween]
undefined

Процесс разумеется, остановился.

Собственно, вопрос.
Отчего tween продолжает работать? И значит ли все это, что при моей задаче, когда необходимо удалить мувик, перед этим необходимо также останавливать весь набор tween'ов, которые присутствуют в мувике?

Вопрос не праздный, была ошибка в одном проекте:
в одном из tween'ов некого мувика на его исполнение (onMotionChanged) присутствовали вызовы других функций и циклы, все это наглухо вешало ролик после удаления мувика-родителя tween'a, поскольку tween продолжал отрабатываться, а все, что с ним связано, еще как-то пыталось выполняться.

rainbowrussia 04.09.2010 04:35

Tween создает в корне ролика клип, которому назначает onEnterFrame. Из-за этого он продолжает спокойно работать. Посмотрите файл Classes/mx/transitions/Tween.as - это сам Твин, он использует OnEnterFrameBeacon.as, где как раз и создается _root.createEmptyMovieClip. Примерно так.
Можно попробовать прописать удаление всех созданных твинов на событии mc.onUnload, чтобы отдельно их не удалять.

mooncar 04.09.2010 11:21

Спасибо, rainbowrussia, я примерно что-то такое себе и представлял.

Не очень только понятно, почему создается _root.createEmptyMovieClip, а не в текущем мувике.

iNils 04.09.2010 11:29

Он создается там где вы его создали. Только, на сколько я помню синтаксис конструктора твин, вы используете не анимацию не по onEnterFrame, а по setInterval.


Часовой пояс GMT +4, время: 05:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.