Форум 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=198430)

ndiezel 26.04.2013 17:29

Как удалить мувик из массива?
 
Всем привет.

Есть функция:
Код AS3:

                        var enArray:Array = new Array();
                        enArray[en_num] = new Enemy_01("right-left",1);
                        addEventListener(Event.ENTER_FRAME,enArray[en_num].EnterFrame);
                        addChild(enArray[en_num]);
 
                        if (en_num>30)
                        {
                                en_num = 0;
                                removeEventListener(Event.ENTER_FRAME,enArray[en_num].EnterFrame);
                                removeChild(enArray[en_num]);
                        }
                        en_num++;

Почему не работает удаление мувика при en_num>30?
Может кто подскажет какое друге решение для создания и удаления массива мувиков?

caseyryan 26.04.2013 18:08

Код AS3:

var enArray:Array = [];
for (var i:int = 0; i < 30; i++) {
      enArray.push(new Enemy_01("right-left",1));
}

п.с. removeChild не удаляет элемент массива. Он удаляет дисплей объект из родительского контейнера

Чтобы удалить какой-то объект из массива, нужно сделать по-другому:
Код AS3:

var index:int = someArray.indexOf(someObject); // если объект в массиве, то его индекс будет больше -1, если его там нет, то -1
if (index > -1) {
      someArray.splice(index, 1); // вырезаем
}


ndiezel 27.04.2013 01:11

caseyryan, честно говоря я не очень понял ваш пример.
Первый код ещё более-менее понятен. А вот второй, для меня по большей своей части - загадка.
Особенно не понятно что такое someObject?
Если я делаю вот так:
Код AS3:

var index:int = enArray.indexOf(Enemy_01);

То всюду -1
Если я этот шаг пропускаю и просто тупо удаляю в массиве объект - то на экране от этого ничего не меняется. Мувик всё так же находится на сцене.
В общем, не очень помогает.

А есть ещё варианты, кроме массива?

Вот у меня игрушка.
На экран - вылетают астероиды. Нужно чтоб при вылете ими за экран - они удалялись. Я пока что не очень понимаю как это сделать с помощью ассива, а других вариантов - я в сети не нашёл.

Кто как подобное вообще делал?

Bletraut 27.04.2013 01:30

Если у тебя астероиды хранятся в каком-то отдельном мувике то ты можешь просто перебирать всех детей этого мувика и удалять тех детей которые вышли за экран. Допустим все астероиды находятся в мувике или спрайте(что бы меньше памяти занимал) под названием asteroidContainer тогда код для удаления астероидов ушедших за экран следующий(размер игровой области 550x400):

Код AS3:

var i:int = asteroidContainer.numChildren;
while(i--)
{
  var j:Asteroid = asteroidContainer.getChildAt(i);
 
  if(j.x > 550 || j.x < 0 || j.y > 400 || j.y < 0) asteroidContainer.removeChild(j);
}


Babylon 27.04.2013 01:36

caseyryan пытался до вас донести, что удаление клипов из контейнера и удаление элемента из массива не одно и тоже. Удаление из массива не приводит к удалению клипа. Это надо делать в цикле.
Присвоение en_num = 0; у вас не удалит 30 клипов:)

Добавлено через 5 минут
И зачем их удалять, чтобы заново создать?)

Партизан 27.04.2013 01:52

Судя по коду из первого поста, создается n мувиков и только последний записывается в только что созданный массив. Более того, каждые 31 помещаются в Display List, каждый 32-й сначала помещается в DL потом тут же удаляется...
С каждым циклом массив создается заново перезаписывая предыдущий.
Или я что-то не понимаю?

chamele0n 27.04.2013 01:57

если у тебя отдельный контейнер для астеройдов, то зачем вообще массив нужен ? (тотже Sprite\Movieclip служит массивом)
зачем удалять астеройд который вылетел за экран ? просто назначь ему стартовые значения и он заного полетит

ndiezel 27.04.2013 04:46

Bletraut, попробовал ваш код - что-то не заработало.
Да и я уже решил другим способом. Пусть и с удалением ребёнка самим собой, но всё же.

Цитата:

И зачем их удалять, чтобы заново создать?)
Цитата:

если у тебя отдельный контейнер для астеройдов, то зачем вообще массив нужен ? (тотже Sprite\Movieclip служит массивом)
зачем удалять астеройд который вылетел за экран ? просто назначь ему стартовые значения и он заного полетит
Нужен новый.
Такая задача.


Сделал так:
Код AS3:

                        var en01_Mov:MovieClip;
                        en01_Mov = new Enemy_01("right-left",enemy_speed);
                        war_zone.addChildAt(en01_Mov,2);

А в самом Enemy_01:
Код AS3:

                        if (x<-50)
                                {
                                        fly_timer.removeEventListener(TimerEvent.TIMER,fly);
                                        fly_timer.stop();
                                        parent.removeChild(this);
                                }



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

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