Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как правильно удалить мувики? (http://www.flasher.ru/forum/showthread.php?t=165972)

interoad 28.08.2011 22:46

Как правильно удалить мувики?
 
Рад всех приветствовать.
Возник вопрос: Как правильно удалять дочерние элементы со сцены при определенных условиях?
Или точнее как к ним обратиться, что бы удалить со сцены.
В интернете я не нашел ни одного наглядного примера более или менее подходящего под мою ситуацию.
Как добавлять мувики – примеров полно, а вот как удалять – особо ничего нет.
Вот добавляю мувики на сцену и удаляю их по клику – все удаляется нормально:
Код AS3:

for (var i:int = 0; i < 10; i ++)
{
        var temp1:MovieClip = new clip();
 
        temp1.x = Math.random() * 400;       
        temp1.y = Math.random() * 400;
 
        temp1.addEventListener(MouseEvent.CLICK, del);
 
        allClips.push(temp1);
 
        trace (allClips.length);
}
        for (var n:int = 0; n<allClips.length;n++)
        {
                addChild(allClips[n]);
        }
 
 
function del(e:MouseEvent):void
{
        obj = MovieClip(e.target);
        removeChild(obj);
}

А вот фрагмент кода, где мне их нужно удалить при условии выхода за "границу".

Код AS3:

temp1.addEventListener(Event.ENTER_FRAME, mov);
 
function mov(e:Event):void
{
        var nClip:MovieClip;
        for (var i:int = 0; I < allClips.length; i++)
        {
                allClips[i].x = allClips[i].x - speed;
                nClip = MovieClip(e.target);
                if (allClips[i].x < 100)
                {
                        container.removeChild(allClips[i]);
                }
        }
 
}

И вот здесь Flash ругается, что удаляемый элемент должен являться дочерним по отношению к вызывающему.
А вот кто тут кто я не пойму.
Наверняка ведь есть оптимальный способ удаления (если есть способ добавления).
Подскажите, как удалить определенные мувики со сцены.
А если их будет очень много?
Надо их как - то по мере продвижения ликвидировать.
А как я не знаю.

ЗлОй ПрОграММер 29.08.2011 01:43

Попробуйте так
Код AS3:

temp1.addEventListener(Event.ENTER_FRAME, mov);
 
function mov(e:Event):void
{
        var nClip:MovieClip;
        for (var i:int = 0; I < allClips.length; i++)
        {
                allClips[i].x = allClips[i].x - speed;
                nClip = MovieClip(e.target);
                if (allClips[i].x < 100)
                {
                      if (allClips[i].parent != null)
                      {
                            allClips[i].parent.removeChild(allClips[i]);
                      }
 
                }
        }
}


in4core 29.08.2011 03:47

Не читал но поправлю сразу - не надо много if ов. в данном коде
Код AS3:

function mov(e:Event):void
{
        var nClip:MovieClip;
        for (var i:int = 0; I < allClips.length; i++)
        {
                allClips[i].x = allClips[i].x - speed;
                nClip = MovieClip(e.target);
                const bool:Boolean = allClips[i].x < 100 && allClips[i].parent != null;
                if (bool)
                {
 
                    allClips[i].parent.removeChild(allClips[i]);
 
                }
        }
}

Пишите красиво...

cleptoman 29.08.2011 09:26

из массива удалять не забывайте!
прям дежавю какое-то

interoad 29.08.2011 10:20

Большое всем спасибо.
И ваше замечание уважаемый cleptoman вполне заслуженно и справедливо.
Я читал Ваши ответы в этой теме форума и согласитесь, что там не совсем то о чем я спрашиваю.
И Ваши ответы про необходимость удаления из массивов я тоже читал.
Вы там объясняете как все прикончить без разбора, а мене это не нужно.
В данной теме затрагивается вопрос не столько удаления а скорее обращения к "размножившимся" клипам.
Может подскажете такую вещь:
При удалении из массива при помощи delete в массиве остаются пустые строки равные Null при обращении к которым опять же возникает ошибка.
Или я опять чего-то не правильно делаю?

Большое спасибо за участие.

dimarik 29.08.2011 10:58

Используйте Array#splice().

dmitry bond 29.08.2011 11:56

Такая же проблемма была, исправил методом splice();

interoad 29.08.2011 20:19

Цитата:

Сообщение от dmitry bond (Сообщение 1026461)
Такая же проблемма была, исправил методом splice();

Чего-то у меня не splice-ется, ни shift-ается.
И вобще стоит чего-нибудь удалить из массива, как сразу все перестает работать. Я и не думал, что удалить элимент еще сложнее чем добавить. (когда не знаешь как).
Есть видь не один способ удалить элемент из массива, но все они заканчиваются крахом.
Работает только если заменить ненужную часть на null. Но тогда Пустые индексы массива разрастаются до бесконечности. И получается на сцене 3-4 мувика а массив длиной аж под 1000!.
Стоит их убрать и все виснет.
Вот только в таком корявом виде кое-как работает.

Код AS3:

// Выше только мувики добавляются в массив и на сцену.
 
stage.addEventListener(Event.ENTER_FRAME, mov);
var t:int =0;
function mov(e:Event):void
{
        for (var i:int = 0; i < сlips.length; i++)
        {
                if (сlips[i] != null)    // Если аргумент не равен "0" если убрать то каюк
                {
                сlips[i].x = сlips[i].x - speed;
 
                const all:Boolean = сlips[i].x < 20 && сlips[i].parent != null;
                if (all)
                {
 
                                        сlips[i].parent.removeChild(сlips[i]);
 
                // Вот с этого момента все перекашивает                       
 
                                        сlips.splice(t, 1, null);
                                        resultt = [сlips.filter( removeEmpty )];
                                        t++;
                }
                }
        }
}
function removeEmpty(a:Object,index:int, source:Array):Boolean {
        if ( !a ) return false;
        return true;
}

Вобщем может есть более-менее адекватный способ, что бы функция не "следила" и не "мусорила"?
result - получается замечательный. Вот только присвоить его clips ни как не представляется возможным.

cleptoman 30.08.2011 13:09

Код AS3:

if (all)        {
 
        сlips[i].parent.removeChild(сlips[i]);
        сlips.splice(i, 1);
}


interoad 30.08.2011 20:49

Спасибо большое.
Этот способ вполне приемлемо работает.
Правда я уже с огромным скрипом сам до этого варианта до рыдся, но все равно огромное всем спасибо за участие!
Вы все мне очень помогли.
Правда теперь все мувики перестали удаляться по клику.
Я просто не знаю как к ним теперь обратиться чтобы удалить.
До читски массива все вроде работало нормально. А теперь кто есть кто не понятно.
Код AS3:

function addClip(e:TimerEvent):void {        
 
                for (i = 0; i < сlips.length; i++)
                {
                        trace(сlips.length);
                        var child:square = new square;               
                        if(сlips[i] == 0)      // Ищю пустые места и вставляю туда Новые клипы
                        {
                                сlips[i] = child;
 
                                сlips[i].x = 500;
                                сlips[i].y = Math.random() * 400;
                      // Добавляю слушателя чилду и помещяю на сцену
                                сlips[i].addEventListener(MouseEvent.MOUSE_DOWN, delMovClip);
                                stage.addChild(сlips[i]);
                        }
                }
}
stage.addEventListener(Event.ENTER_FRAME, mov);
// здесь клип двигается
 
function mov(e:Event):void
{
        for (var i:int = 0; i < сlips.length; i++)
        {
                if (сlips[i] != 0)
                {
                сlips[i].x = сlips[i].x - speed;
                // здесь клип удаляется
                const all:Boolean = сlips[i].x < 20 && сlips[i].parent != null;
                if (all)
                {
 
                                        сlips[i].parent.removeChild(сlips[i]);
                                        сlips.splice(i, 1, 0);
 
                }
                }
        }
}
        function delMovClip(e:MouseEvent):void {
 
          ???????.removeChild(??????); // А вот здесь я впал в ступор
// Как не обращусь пише, что объект не имеет свойств или еще чего-нить
}

Вы особо не смейтесь. Просто я еще плохо ориентируюсь в этом языке и по этому и обращаюсь с такими пустяковыми вопросами.
По моему в As главное знать как правильно обратиться к нужному объекту, а остальное все дело техники.
А вот именно это-то до меня чего - то туго доходит.
Кто дочерний, кто не дочерний и если он ползает по сцене, то почему он не дочерний stage?
Ладно. по тихоньку разберусь, а пока надеюсь, что Вы не откажете в совете время от времени.


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

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