Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   for не выполняет всех интераций!!! О_О (http://www.flasher.ru/forum/showthread.php?t=165913)

CrazyPHP 28.08.2011 05:04

for не выполняет всех интераций!!! О_О
 
Имеется следующий кусок кода:
Код AS3:

//очистим карту
trace(map_layer.numChildren);
for(var i=0; i<map_layer.numChildren; i++){
    trace(i);
    //удалим
    map_layer.removeChildAt(i);
    //
}
//

вывод trace вот такой:
Код AS3:

7
0
1
2
3

т.е. детей он насчитал 7, а интераций выполнил 4. Как это возможно? Бред какойто!

Добавлено через 10 минут
Сделал вот так заработало, кто бы мог подумать, индексы в массиве детей изменяются динамически... хмм..
Код AS3:

//очистим карту
                        trace(map_layer.numChildren);
                        var child_count = map_layer.numChildren-1;
                        for(var i=child_count; i>=0; i--){
trace(i);
                                //удалим сам объект
                                map_layer.removeChildAt(i);
                                //
                        }
                        //


saikspaik 28.08.2011 05:15

Ну так ты с помощью removeChildAt(i), уменьшаешь количество детей, поэтому все выполняется как положено.
Запиши в переменную количество детей, а потом используй его в цикле.

Добавлено через 14 минут
Цитата:

кто бы мог подумать, индексы в массиве детей изменяются динамически... хмм..
Хм, как бы им еще изменяться?

ProxyGreen 28.08.2011 09:14

Код AS3:

while (map_layer.numChildren > 0) {
                          map_layer.removeChildAt(0);
                  }


vorodis2 28.08.2011 12:10

Если те всех нужно прибить я делаю
Код AS3:

for(i=0; i>2; i++){
  if(map_layer.numChildren > 0) {map_layer.removeChildAt(0); i=0; }
}


СлаваRa 28.08.2011 12:40

вот еще вариант

Код AS3:

while (контейнер.numChildren) 
    if (удаляемый_клип.parent)
        контейнер.removeChild(удаляемый_клип)


kackbip 28.08.2011 12:44

Цитата:

2ProxyGreen, если не проверять наличие родителя, могут возникать ошибки
В примере, который привел 2ProxyGreen, нет смысла проверять наличие parent.

i.o. 28.08.2011 12:52

Цитата:

Сообщение от vorodis2 (Сообщение 1026165)
Если те всех нужно прибить я делаю
Код AS3:

for(i=0; i>2; i++){
  if(map_layer.numChildren > 0) {map_layer.removeChildAt(0); i=0; }
}


Тяжелое прошлое в кадрах? :)

Добавлено через 2 минуты
Можно еще так:
Код AS3:

var i:int = container.numChildren;
while (i--)
    container.removeChildAt(i);


etc 28.08.2011 13:05

Самый быстрый, как ни странно, while (map_layer.numChildren) map_layer.removeChildAt(0);.

Aquahawk 28.08.2011 13:48

Цитата:

Сообщение от i.o. (Сообщение 1026172)
Можно еще так:
Код AS3:

var i:int = container.numChildren;
while (i--)
    container.removeChildAt(i);


Нельзя так. Например может быть дисплейобджект, который на свой ремув утащит ещё что-нибудь с парента. У меня так текстфилды с кастомный бекграундом сделаны. Класс наследник текстфилда не может сделать addchild на себя. А нужен хитрый динамический фон. Для этого он на своём событии added на парента складывает бекграунд и свапается с ним, а на ремувед, удаляет свой бекграунд сам. Такми образом это внешне текстфилд и весь код который работает с текстфилдом, работает и с ним, а уже он сам за собой таскает свой фон.(естественно переопределены сеттеры размеров и координат). Так вот когда сремувится текстфилд, он ремувит фон, и приведённый код выпадет с ошибкой.

etc 28.08.2011 13:52

Цитата:

Сообщение от Aquahawk (Сообщение 1026187)
может быть дисплейобджект, который на свой ремув утащит ещё что-нибудь с парента.

Это называется плохо спроектированный код. В вашем случае конечно так нельзя. Но это только в вашем случае.


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

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