PDA

Просмотр полной версии : tween не останавливается


TanaTiX
29.03.2008, 00:10
Сабж. Честно говоря проблема может оказаться и шире, но ИМХО корень злав моей сцене именно в неработающем .stop(); для твин-анимации.
Код выполняет слайд-шоу для 4х подгружаемых изображений.
import mx.transitions.*;
var my_mcl:MovieClipLoader = new MovieClipLoader();
var my_lst:Object = new Object();
my_mcl.addListener(my_lst);

speed = 2;//скорость изменения прозрачности
timer = 3000;//задержка перед сменой изображения
imageCount = 4;//количество подгружаемых картинок

// создание верхнего и нижнего мувика
_root.mc.createEmptyMovieClip("down",0);
_root.mc.createEmptyMovieClip("up",getNextHighestDepth());

//загрузка исходных картинок
_root.my_mcl.loadClip("1.jpg",_root.mc.down);
_root.my_mcl.loadClip("2.jpg",_root.mc.up);
_root.my_mcl.onLoadComplete = function() {
_root.my_mcl.onLoadComplete = function() {
//назначение прозрачности верхнему слою
_root.mc.up._alpha = 0;
};
//задержка перед началом функции
var time_pause = setTimeout(changeAlpha, timer);
};
//собственно функция
function changeAlpha() {
//анимация альфы для верхнего изображения
var tweenFirst = new Tween(_root.mc.up, "_alpha", mx.transitions.easing.None.easeNone, 0, 100, speed, true);
tweenFirst.onMotionFinished = function() {
tweenFirst.stop();
slider();
};
}
function slider() {
//проверка вхождения в цикл и назначение переменной
//переменные отображают текущую верхнюю и нижнюю картинку
if (!k) {
k = 2;
}
if (k>imageCount) {
k = 1;
}
n = k+1;
if (n>imageCount) {
n = 1;
}
_root.my_mcl.loadClip(k+".jpg",_root.mc.down);

_root.my_lst.onLoadComplete = function() {
_root.mc.up._alpha = 0;
_root.my_mcl.loadClip(n+".jpg",_root.mc.up);

_root.my_lst.onLoadComplete = function() {
//задержка перед анимацией
setTimeout(cycleAlpha,timer);
function cycleAlpha() {
var cycleTween = new Tween(_root.mc.up, "_alpha", mx.transitions.easing.None.easeNone, 0, 100, speed, true);
cycleTween.onMotionFinished = function() {
//проверка наличия tween-анимация до и после ее остановки
trace("Aftre: "+cycleTween);
cycleTween.stop();
trace("Before: "+cycleTween);
//увеличение переменной
k++;
//зацикливание функции
slider();
};
}
};
};
}

Molecula
29.03.2008, 00:22
tweenFirst.stop();
Это лишнее, Вы останавливаете то, что уже остановилось :D
И это так же:
cycleTween.stop();

Зачем Вы везде _root используете?

Про это вообще молчу.
_root.my_mcl.loadClip("1.jpg",_root.mc.down);
_root.my_mcl.loadClip("2.jpg",_root.mc.up);
_root.my_mcl.onLoadComplete = function() {
_root.my_mcl.onLoadComplete = function() {
//назначение прозрачности верхнему слою
_root.mc.up._alpha = 0;
};
//задержка перед началом функции
var time_pause = setTimeout(changeAlpha, timer);
};
У Вас код очень проблемный, так что корень зла в нём.
Создайте общую функцию загрузки с одним
MovieClipLoader
и событием
onLoadComplete

TanaTiX
29.03.2008, 00:34
Дело в том, что если не остановить твин, то при повторном посещении страницы он наверняка наложится на новый. При этом можно будет наблюдать мигание всего и вся. Уже был такой печальный опыт :( В данном примере представлен лишь голый код вне целостного проекта.
А чем руты плохи?
Про это вообще молчу.
Создайте общую функцию загрузки с одним MovieClipLoader и событием onLoadComplete
честно говоря не представляю как это осуществить и как к этому подступиться... Сам по себе код работает, проблемы возникают при расположении его в основной документ (визуально также работающий без проблем)
Заранее спасибо за помощь.

Molecula
29.03.2008, 01:10
Ну вроде такого:
import mx.utils.Delegate;
var mcl:MovieClipLoader = new MovieClipLoader();

this.onLoadInit = Delegate.create(this, Init);
mcl.addListener(this);

function Init(target:MovieClip) {
if (a<b) {//условие какое-то, если надо;
loadMc(path,mc);//ну, или другое что-то делаем;
}
}

function loadMc(url:String, target:MovieClip) {
mcl.loadClip(url,target);
}

А чем руты плохи?
А если эту флешку подгружать будем?

TanaTiX
29.03.2008, 01:15
Molecula, сенкс, учту
...к сожалению это проблему пока не решает :(
ЗЫ. пока создаю с тем учетом, что ничто никуда подгружаться не будет...

Molecula
29.03.2008, 01:20
Ок. Кстати, Вы не на то навешали:
_root.my_mcl.onLoadComplete = function() {
А надо на:
var my_lst:Object = new Object();

TanaTiX
29.03.2008, 01:35
Это так что ли?
_root.my_lst.onLoadComplete=new Object(timeObj);
timeObj = setTimeout(cycleAlpha,timer);
function cycleAlpha() {...
...и тоже не решает проблему :(

Molecula
29.03.2008, 03:36
Нет! Внимательней.
_root.my_mcl.onLoadComplete = function() {
my_mcl - это у Вас MovieClipLoader, а надо на объект вешать, т.е. на my_lst.
Вы же его объектом сделали:
var my_lst:Object = new Object();
Поэтому, та срашная конструкция и не работает.
Ведь Вы подписали так:
my_mcl.addListener(my_lst);
А my_lst не присвоили ивент.
Но, мне честоно говоря, страшно что будет, когда та махина заработает :D

TanaTiX
29.03.2008, 04:02
Но, мне честоно говоря, страшно что будет, когда та махина заработает
после этой фразы и пробовать страшно...:confused:
...и вообще что-то я на ночь сильно запутался. Буду надеятся, что утром или все пойму или кто-то предложит не такое "страшное" решение;)