PDA

Просмотр полной версии : Slideshow with timer


intrdr
06.06.2011, 12:52
Добрый день!

Есть набор картинок. Задача: сделать slideshow. Через определённый промежуток времени картинки сменяют друг друга, появляясь из непрозрачности.

Пытаюсь реализовать это без использования timeline.

Исходник явно не совершенен, и явно можно было сделать куда грамотнее, но у меня получилось так. проблема в том, что он не реагирует на строчки:...





c = 4; //количество картинок
count = 0; //счётчик для таймера
A = 1; //переменные для объектов
B = 2;

// прячем лишние картинки (все кроме первой)
for (i = 2; i < c; i++){
curClip = this["obj"+i];
curClip._alpha = 0;
trace (curClip);
}


pause = function () {
if (count == 200){
curClip1 = this["obj"+A]; //в этом месте не происходит ассоциация с нужной картинкой
curClip2 = this["obj"+B]; //ну и здесь, естественно тоже самое...
count = 0;
curClip1._alpha = 0;
curClip1.swapDepths(curClip2);
trace (curClip1);
if (A < c){
A ++;
}
else {
A = 1;
}
if (B < c){
B ++;
}
else {
B = 1;
}

}
count ++;
curClip1._alpha ++;

//clearInterval(pausei);
}

pauseSwap = setInterval(pause, 5);


Почему не происходит ассоциация с картинками внутри функции?

Или может есть куда более правильный способ?

Заранее спасибо!

mooncar
06.06.2011, 13:12
Вот здесь вставьте трейс:
pause = function () {
trace(this);
И посмотрите, что он выведет.
Увидите, что this в данном случае не ссылается на нужный объект, в котором расположены картинки.

Замените this на _root, если у вас все ваши ["obj"+A] и ["obj"+B] находятся прямо на нем. Либо замените на тот контейнер, где они находятся.

Либо вот такое решение, более корректное и универсальное:
pause = function (cont:Object) {
if (count == 200){
curClip1 = cont["obj"+A];
curClip2 = cont["obj"+B];
....
}

pauseSwap = setInterval(pause, 5, this);
То есть ссылку на текущий таймлайн (this), где у вас контейнеры с картинками, передаем аргументом в подинтервальную функцию.

И замените имя функции, pause - служебное слово.

intrdr
06.06.2011, 14:19
Огромное спасибо! Именно так как надо.

Но тетерь стало очевидно, что .swapDepths работает не так как ожидалось.

Слегка изменил код, вот что в итоге получилось:

c = 3;
count = 0;
A = 1;
B = 0;

for (i = 1; i < c; i++){
curClip = this["obj"+i];
curClip._alpha = 0;
//trace (this);
}


mPause = function (cont:Object) {
if (count == 200){
//trace (this);
curClipA = cont["obj"+A];
curClipB = cont["obj"+B];
count = 0;

curClipA.swapDepths(curClipB);
curClipA._alpha = 0;


trace (curClipA);
trace (curClipB);
trace ("----------")
if (A < c-1){
A ++;
}
else {
A = 0;
}
if (B < c-1){
B ++;
}
else {
B = 0;
}

}
count ++;
curClipA._alpha ++;

//clearInterval(pausei);
}

pauseSwap = setInterval(mPause, 5, this);

Но глубина не переходит последовательно от прошлой картинки к следующей... :(

mooncar
06.06.2011, 14:47
Глубина - это дискретное состояние. Она принимает конкретное значение, определяющее расположение объекта по виртуальной Z-координате.
Честно говоря, сейчас подробно смотреть, как у вас и что меняется, не могу, вот вам инструмент, им воспользуйтесь для того, чтобы смотреть, где что находится в какой момент:
trace(mc.getDepth())
чтобы посмотреть, на какую глубину у вас что встает.

intrdr
06.06.2011, 16:23
Спасибо за наводку.
В итоге сделал через
curClipA.swapDepths( cont.getNextHighestDepth() );