Просмотр полной версии : метод stop() у TWEEN
удаляет ли он все внутренние структуры (листенеры и т.п.) экземпляра класса Tween? не отвисают ли они в памяти?
Просто нужно удалить (destroy) полностью экземпляры этого класса...
Раздел для профи не для подобных вопросов.
Удалить твин можно просто используя delete.
delete удалит ссылку на на Tween как я понимаю, сам твин будет жить и здравствовать.
this.create
02.03.2007, 23:36
А как же тот факт, что объект удаляется сборщиком мусора, если на него нет ссылок в коде?
delete удалит ссылку на на Tween как я понимаю, сам твин будет жить и здравствовать.
Сначала stop(), потом delete сразу. А ещё можно было заглянуть в сам класс и посмотреть, как он устроен.
спасибо за более-менее внятный ответ =)
нет, не удаляет. delete тоже не все удалит =) останется __onEnterFrameBeacon например.
Нужно удалить твин, а не броадкастер. stop() снесет твин из листенеров, а delete уже снесет сам твин, вуаля.
this.create
04.03.2007, 20:35
import mx.transitions.*;
import mx.transitions.easing.*;
//
var mc:MovieClip = this.attachMovie('mc', 'mc', this.getNextHighestDepth(), {_x:20, _y:100});
var tw:Tween = new Tween(mc, '_x', Strong.easeOut, 0, 100, 1, true);
tw.onMotionFinished = function():Void {
this.stop();
delete this.onMotionFinished
delete this;
};
Так правильно удалять?
import mx.transitions.*;
import mx.transitions.easing.*;
//
function effect(mc:MovieClip):Void {
var tw:Tween = new Tween(mc, '_x', Strong.easeOut, 0, 100, 1, true);
tw.onMotionFinished = function():Void {
this.stop();
delete this.onMotionFinished;
delete this;
};
}
var mc:MovieClip = this.attachMovie('mc', 'mc', this.getNextHighestDepth(), {_x:20, _y:100});
effect(mc);
Если у меня твин оформлен в функцию, то все равно проделывать полное удаление?
this.stop();
delete this.onMotionFinished
delete this;
};
Так правильно удалять?
Ссылку на самого себя удалить невозможно. Нужно делать остановку твина по первой ссылке на него и удалять эту ссылку.
this.create
04.03.2007, 21:42
import mx.transitions.*;
import mx.transitions.easing.*;
//
var tw:Tween;
//
function effect(mc:MovieClip):Void {
tw = new Tween(mc, '_x', Strong.easeOut, 0, 100, 1, true);
tw.onMotionStopped = function():Void {
delete tw;
};
}
var mc:MovieClip = this.attachMovie('mc', 'mc', this.getNextHighestDepth(), {_x:20, _y:100});
effect(mc); Только не пойму, как мне сделать тогда частые( пока не кончилась анимация предыдущих твинов) вызовы этой функции.
В приват this.create задал мне вопрос который оказался интересным и поэтому я отвечу тут.
Сам вопрос:
Здравствуйте.
В этой теме http://flasher.ru/forum/showthread.php?t=92648 обсуждалось как правильно удалять Tween. Я так же столкнулся с этим и хочу у вас поинтересоваться, как же все таки правильно это сделать.
Тов. __etc мне ответил, но я что-то все равно не пойму.
Вот у меня есть код:
import mx.transitions.*;
import mx.transitions.easing.*;
//
function effect(mc:MovieClip):Void {
var tw1:Tween = new Tween(mc, '_alpha', Strong.easeOut, 0, 100, 2, true);
var tw2:Tween = new Tween(mc, '_x', Strong.easeOut, mc._x, 0, 2, true);
}
var mc:MovieClip = this.attachMovie('mc', 'mc', this.getNextHighestDepth());
effect(mc);
После выполнения функции, в фильме не остается ссылок на твины и они должны быть удалены. Но не удаляются, ведь анимация проходит до конца. Значит они остаются. Далее в help прочитал про событие onAnimationStopped - происходит после остановки анимации и когда анимация доходит до конца. Скажите после этого события объекты tw1 и tw2 уже удаляются?
Далее:
import mx.transitions.*;
import mx.transitions.easing.*;
var interval:Number;
var ednInt:Number = 0;
//
function effect(mc:MovieClip):Void {
var tw1:Tween = new Tween(mc, '_alpha', Strong.easeOut, 0, 100, 2, true);
var tw2:Tween = new Tween(mc, '_x', Strong.easeOut, mc._x, 0, 2, true);
endInt == 5 ? clearInterval(interval) : endInt++;
}
var mc:MovieClip = this.attachMovie('mc', 'mc', this.getNextHighestDepth());
interval = setInterval(effect, 1000, mc);
Вот именно в такой конструкции меня беспокоит удаление твинов. Старые твины могут не закончится когда начинаются новые. Ссылки теряются на все твины. Не происходит ли в таком случает накапливания каких-то элеменов класса твин? И как все же их удалять корректно?
Начнем с такого кода (аттач я убрал и создал клип с именем mc)
import mx.transitions.*;
import mx.transitions.easing.*;
function effect (mc:MovieClip):Void {
var tw1:Tween = new Tween (mc, '_x', Strong.easeOut, 200, 100, 4, true);
var tw2:Tween = new Tween (mc, '_x', Strong.easeOut, 100, 200, 1, true);
}
effect (mc)
Как видим после выполнения твина tw2, доигрывается tw1. Но приоритет имеет последний добавленный твин.
Модифицируем код ("родной" фпс был 31):
import mx.transitions.*;
import mx.transitions.easing.*;
function effect (mc:MovieClip):Void {
var tw1:Tween = new Tween (mc, '_x', Strong.easeOut, 200, 100, 4, true);
var tw2:Tween = new Tween (mc, '_x', Strong.easeOut, 100, 200, 1, true);
tw1.FPS = 100;
}
effect (mc);
Теперь твины "дерутся" за клип :)
Еще один эксперимент:
import mx.transitions.*;
import mx.transitions.easing.*;
dx = 0;
function effect (mc:MovieClip):Void {
trace (dx);
trace ("-------");
dx++;
var tw1:Tween = new Tween (mc, '_x', Strong.easeOut, 1000, 100, 2 + dx * 10, false);
var tw2:Tween = new Tween (mc, '_x', Strong.easeOut, 100, 200, 1 + dx * 10, false);
}
setInterval(this, "effect", 100, mc);
Но перед запуском ищем код класса твин Tween.as и в методе setPosition вставляем строчку (не забудьте потом убрать):
trace (this.duration)
Теперь запускаем и видим в окне output:
0
-------
undefined
12
undefined
11
12
11
12
11
12
11
12
11
1
-------
undefined
22
undefined
21
12
11
22
21
12
11
22
21
12
11
22
21
12
11
22
21
... и так далее
Белым я выделил тот момент который нас интересует, а именно, что все твины продолжают выполняться до тех пор, пока они сами не закончатся (десятки, сотни и тд являются своеобразными метками каждой пары вызванных твинов с помощью setInterval, а единицы отражают сами парные твины).
Чуть позже напишу пример в этот пост.
UPDATE:
Твин будут удален в том случае, когда:
а) Он остановлен (т.е. у OnEnterFrameBeacon нет ссылки на этот твин);
б) На твин удалены все ссылки, т.е. никаких ссылок из массивов, других клипов и т.п. Идеально, если на твин существует одна ссылка (вторая в Beacon не в счет). Тогда при удалении (и предвартительной остановки, естесственно) этой ссылки твин будет выгружен из памяти.
this.create
06.03.2007, 02:20
... что все твины продолжают выполняться до тех пор, пока они сами не закончатся.
Т.е как я понял, можно запустить хоть 100 с короткими интервалами и потерять ссылки. Просто каждый доиграет и сам удалится. Правильно?
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.