Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Дублирование movieclip при использовании setChildIndex. (http://www.flasher.ru/forum/showthread.php?t=137085)

Альбина1983 04.03.2010 10:44

Дублирование movieclip при использовании setChildIndex.
 
Сделала небольшую открыточку.
Состоит из 5 объектов - movieclip (mc1, mc2, ... mc5), которые расположены в основной сцене. Во всех mc в первом кадре стоит stop().
Вызываю в первом кадре основной сцены
Код AS3:

var i:Number = Math.random();

В зависимости от значения i запускаю анимацию того или иного mc.
Например
Код AS3:

mc1.gotoAndPlay(2).

Дополнительно надо чтобы он был на переднем плане, почитала и сделала так:
Код AS3:

this.setChildIndex(mc1, this.numChildren - 1);

Т.е. проигрывается анимация случайного клипа на переднем плане и так в цикле.
И все работает, уже обрадовалась самой себе, но... заметила, что если открытка работает больше 5-10 минут начинает ужасно тормозить, провела несколько экспериментов и обнаружила, что при вызове setChildIndex создается дополнительный объект. (Использовала setChildIndex и дополнительно смещала клип, причем mc1.gotoAndPlay(2) запускает только один, тот который передвинулся, а все его копии неподвижны). Т.е. при каждом вызове this.setChildIndex(mc1, this.numChildren - 1) увеличивается this.numChildren на единицу.
Пыталась удалять их через removeChildAt(this.numChildren - 1); но ничего не помогает.
Мальчики помогите пожалуйста, что я делаю не так?
Может быть есть другой способ вытаскивать объекты на передний план???
Мне так хочется сделать открытку!!!! Я уже почти плачу. :'(

P.S. flash cs4. as3.

Добавлено через 3 часа 27 минут
Неужели никто девушке не поможет в канун праздника???

GentleFLASH 04.03.2010 14:48

Было бы здорово увидеть более полный код ;)
А вообще можно попробовать использовать swapChildrenAt() вместо setChildrenIndex(). Хотя вряд ли дело в этом, тут другое что-то скорее всего.

Альбина1983 04.03.2010 15:06

Вот собственно весь код.
Код AS3:

var i:Number = Math.random();
if (i<0.2) {
        this.setChildIndex(mc1, this.numChildren-1);
        mc1.gotoAndPlay(5);
}
if (i>=0.2 && i<0.4) {
        this.setChildIndex(mc2, this.numChildren-1);
        mc2.gotoAndPlay(5);
}
 
if (i>=0.4 && i<0.6) {
        this.setChildIndex(mc3, this.numChildren-1);
        mc3.gotoAndPlay(5);
}
 
if (i>=0.6 && i<0.8) {
        this.setChildIndex(mc4, this.numChildren-1);
        mc4.gotoAndPlay(5);
}
 
if (i>=0.8 && i<=1) {
        this.setChildIndex(mc5, this.numChildren-1);
        mc5.gotoAndPlay(5);
}

Пробовала вот так:
Код AS3:

this.swapChildrenAt(getChildIndex(mc1), this.numChildren-1);

но результат тот же через какое-то время начинает тормозить..

derhab 04.03.2010 15:22

а те мувики что уже один раз запущены не останавливаются когда перекрываются следующим?

Альбина1983 04.03.2010 15:27

Цитата:

Сообщение от derhab (Сообщение 890916)
а те мувики что уже один раз запущены не останавливаются когда перекрываются следующим?

внутри мувиков на первом кадре стоит Stop();

GentleFLASH 04.03.2010 15:54

Вероятно потому что код написан в кадрах, и видимо в каком то кадре есть создание нового мувика, что собственно и повторяется. Либо все это связано как то с .gotoAndPlay(5); Может в с 5го кадра этих мувиков есть код какой то в кадрах.
А вообще проверить легко зависит ли это от перемещения слоя или нет.
Замени на вот это:

Код AS3:

var i:Number = Math.random();
var mc_tmp:MovieClip;
 
if (i<0.2)
{
        mc_tmp = mc1;
}
else if (i>=0.2 && i<0.4)
{
        mc_tmp = mc2;
}
else if (i>=0.4 && i<0.6)
{
        mc_tmp = mc3;
}
else if (i>=0.6 && i<0.8)
{
        mc_tmp = mc4;
}
else
{
        mc_tmp = mc5;
}
 
 
trace( "before: " + this.numChildren );
this.setChildIndex(mc_tmp, this.numChildren-1);
trace( "afterA: " + this.numChildren );
mc_tmp.gotoAndPlay(5);
trace( "afterB: " + this.numChildren );
mc_tmp = null;

если напечатанный afterA будет больше, чем before, то дело действительно в смене слоя мувика. А если нет - то дело в другом.

Альбина1983 04.03.2010 16:08

Цитата:

Сообщение от GentleFLASH (Сообщение 890931)
Вероятно потому что код написан в кадрах, и видимо в каком то кадре есть создание нового мувика, что собственно и повторяется. Либо все это связано как то с .gotoAndPlay(5); Может в с 5го кадра этих мувиков есть код какой то в кадрах.

Я попробовала поставить, что вы сказали, но я не понимаю где смотреть трассировку.
:wacko:

Я простенький пример сделала и разместила тут: http://***********/4338495
В нем вся суть отражается. Посмотрите пожалуйста, добрый молодой человек. :)

iNils 04.03.2010 16:25

Альбина1983, для оформления своего кода надо использовать теги [code][/code]

Альбина1983 04.03.2010 16:42

iNils
Спасибо, что все поправили. Постараюсь впредь не нарушать правило!

GentleFLASH 04.03.2010 17:13

Такого я не встречал еще. Очень удивлен таким поведением. Главное duplicateMovieClip() удален, а тут как то само получается, а самое главное зачем его удаляли, если без проблем реализуемо, но это так, отголоски прошлого... Главная причина - наличие более одного кадра и функции addChild / setChildIndex. Смогло без багов заработать только так: кадр должен быть в руте 1 и в нем должно стоять:

Код AS3:

addEventListener( Event.ENTER_FRAME, OEF );
 
 
var _frame:int = int.MAX_VALUE-1;
 
function OEF( e:Event ):void
{
        if( ++_frame > 70 )
        {
                _frame = 0;
 
                var f:Number = Math.random();
 
                text1.text = String(this.numChildren);
                text2.text = String(getChildIndex(mc1));
 
                setChildIndex( mc1, this.numChildren-1 );
                mc1.gotoAndPlay(2);
 
        }
}

где 70 - это интервал в кадрах.

Кстати, для тех кто против кода в кадрах - вынос в класс не помогает, если в мувике больше 2х кадров и в них не стоит stop(). Дублируется именно в переход с последнего кадра на первый. А может и просто на кадр назад..


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

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