Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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.
Старый 04.09.2010, 04:35
rainbowrussia вне форума Посмотреть профиль Отправить личное сообщение для rainbowrussia Найти все сообщения от rainbowrussia
  № 2  
Ответить с цитированием
rainbowrussia
 
Аватар для rainbowrussia

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


Последний раз редактировалось rainbowrussia; 04.09.2010 в 06:25.
Старый 04.09.2010, 11:21
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 3  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Спасибо, rainbowrussia, я примерно что-то такое себе и представлял.

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

Старый 04.09.2010, 11:29
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Он создается там где вы его создали. Только, на сколько я помню синтаксис конструктора твин, вы используете не анимацию не по onEnterFrame, а по setInterval.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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