Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос: удаление всех Child из родительского мувика. (http://www.flasher.ru/forum/showthread.php?t=108958)

Azim 04.03.2008 13:35

Вопрос: удаление всех Child из родительского мувика.
 
Перевожу прогу AS2->AS3.

Проблема:
Есть top:MovieClip - родительский.
В нем создаю через new MovieClip и addChild еще мувики (программно создаю).
Есть кнопка очистки родительского мувика. Алгоритм чистки следующий:
function clearTop(){
for(var i:Number = 1; i<=top.numChildren; i++){
if(top.getChildAt(i)){
top.removeChildAt(i);
}
}
}
Алгоритм работает один раз - чистит содержимое top, а на второй раз - ругается что нет нифига - ругается 2006 ошибкой, типа нет мувика с таким индексом. Хотя проверку я поставил.

Как сделать корректную проверку на существование Child?

Замена top.getChildAt(i) на Boolean(top.getChildAt(i)) - ничего не дала

BlooDHounD 04.03.2008 13:52

Ошибки:
1. индексы детей начинаются с 0.
2.
Код:

if(top.getChildAt(i)){
top.removeChildAt(i);
}

код бесмысленен. в АС3 не бывает пустых пространств между детьми. удаляя одно дитя, все кто сидел выше смещаются вниз.
3.
Код:

for(var i:Number = 1; i<=top.numChildren; i++){...
по причине описанный в п.2, у вас вообще получается обсурд. с каждым удалёнием numChildren уменьшается на 1. и при этом вы удаляете i-тый элемент.

вот ваш алгаритм:

Код:

start.    1.        2.        3.
0 - A      0 - A      0 - A      0 - A
1 - B      1 - C      1 - C      1 - C
2 - C      2 - D      2 - E      2 - E
3 - D      3 - E      3 - F
4 - E      4 - F
5 - F


Azim 04.03.2008 14:54

Обалдеть! А как тогда правильно удалить всех детей родительского мува?

Mr. Fixit 04.03.2008 15:00

или так:
Код:

while(this.numChildern > 0) this.removeChildAt(0);
или так:
Код:

for(var i : int = 0; i < this.numChildern; i++) this.removeChildAt(0);
или так:
Код:

for(var i : int = this.numChildern-1; i >= 0 ; i--) this.removeChildAt(this.numChildern-1);
или еще как-то :D

BlooDHounD 04.03.2008 15:03

или так:
Код:

var num:int = super.numChildren;
while ((num -= 1)>0) super.removeChildAt(num);


Azim 04.03.2008 15:05

Парни! Идеально! Спасибо!!
Недопетривал стековость контейнера. Теперь вообще многое прояснилось)))

Бармалей 04.03.2008 16:46

Маленькая лепта от меня:
Код:

while (container.numChildren)
        container.removeChildAt(container.numChildren - 1);

Удалять элементы с нулевой глубины - труднозатратно, поскольку элементы следующие за удаленным будут сдвинуты на единицу вниз. Представьте, если в контейнере содержатся несколько тысяч чайлдов.

BlooDHounD 04.03.2008 17:17

ну если на то пошло то numChildren тоже жрёт ресурсы.

Бармалей 04.03.2008 17:33

Ну я не спорю, только почему-то мне кажется, что numChildren кэшируется при изменении количества детей и возвращается по требованию, а не пересчитывается каждый раз при обращении к нему. ;-)

_Smirnoff 04.03.2008 17:48

Узнайте кол-во детей один раз...и удаляйте относительно него + лучше удалать, начиная с верхних, чтоб не менять индексы слоев при удалении.


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

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