Показать сообщение отдельно
Старый 04.09.2010, 02:50
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 1  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
По умолчанию Как правильно удалить мувик с выполняющимся внутри 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 продолжал отрабатываться, а все, что с ним связано, еще как-то пыталось выполняться.
__________________
Идите первым!


Последний раз редактировалось mooncar; 04.09.2010 в 03:15.