Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.07.2011, 14:46
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 1  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
По умолчанию Удаление детей в цикле

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

Дано контейнер А. В нем изначально 100 клипов одного класса. Затем в контейнер добавляются еще дети, но уже другого класса. Вопрос

Код AS3:
for (var i:int = 0; i < A.numChildren; i++) {
 
	var co:DisplayObject = A.getChildAt(i);
 
	if (co is NewClass) _A.removeChildAt(i);
}
Если не так, то как? Ведь индексы сдвигаются после удаления. Дело в том, что я конечно знаю что индексация идет со 100, и проблем в удалении не вижу, но хочется рациональный способ для любой ситуации.
__________________
Марк Tween

Старый 25.07.2011, 14:53
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 2  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
может кто-то сочтет это быдлокодерством, но я бы сделал так:
перед циклом создал пустой массив, пробежался бы по детям, так же как сделал ты, но вместо удаления, затолкал бы нужное в этот массив, а потом уже пробежкой по этому массиву в обратном порядке, снес бы все ненужное

Старый 25.07.2011, 14:55
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 3  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Как вариант:
Код AS3:
if (co is NewClass) _A.removeChildAt(i--);

Старый 25.07.2011, 15:00
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 4  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
как вариант - не прокатит )) То что индекс мы уменьшили это хорошо, а вот конечное значение цикла не меняется.
Goodguy , не могу сказать , что это быдлокодство, этот вариант и так понятен, я думаю должен же быть какой то красивый вариант
__________________
Марк Tween

Старый 25.07.2011, 15:02
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 5  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Цитата:
Сообщение от in4core Посмотреть сообщение
То что индекс мы уменьшили это хорошо, а вот конечное
Начните конечным значением индекса, а заканчивайте нулем.

Старый 25.07.2011, 15:11
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 6  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Цитата:
а вот конечное значение цикла не меняется
numChildren меняется после removeChildAt.
Код AS3:
package 
{
    import flash.display.DisplayObject;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
 
    public class TestProject extends Sprite 
    {
        public function TestProject() 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(event:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
 
            for (var i:int = 0; i < 5; i++)
                if (Math.random() > 0.5)
                    addChild(createSprite(i));
                else
                    addChild(createMovieClip(i));
 
            for (var j:int = 0; j < numChildren; j++)
            {
                trace(getChildAt(j));
                var co:DisplayObject = getChildAt(j);
                if (co is MovieClip)
                    removeChildAt(j--);
                // В итоге останутся только белые кружки спрайтов.
            }
        }
 
        private function createSprite(i:int):Sprite
        {
            var s:Sprite = new Sprite();
            s.graphics.lineStyle(1);
            s.graphics.beginFill(0xFFFFFF);
            s.graphics.drawCircle(i * 20 + 10, i * 20 + 10, 20);
            return s;
        }
        private function createMovieClip(i:int):Sprite
        {
            var m:MovieClip = new MovieClip();
            m.graphics.lineStyle(1);
            m.graphics.beginFill(0x5555FF);
            m.graphics.drawCircle(i * 20 + 10, i * 20 + 10, 20);
            return m;
        }
    }
}


Последний раз редактировалось bav; 25.07.2011 в 15:15.
Старый 25.07.2011, 15:15
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 7  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Сделайте обратный цикл от numchildren до 0
UPD опередили)
__________________
Отряд Котовскага

Старый 25.07.2011, 15:20
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 8  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Все верно bav , только я тут немного условия не указал видимо....

Вот пример

Код AS3:
private function cancelBet(e:MouseEvent):void 
		{
			for (var i:int = 0 ;  i < _TB.numChildren; i++ ) {
 
				var co:DisplayObject = _TB.getChildAt(i);
				var a:Boolean = co is Coin;
				var b:Boolean = (co as Coin).code == _serverBetCode; // тут ругаемся
 
				if (a && b ) _TB.removeChildAt(i--) ;
 
			}
		}
Добавлено через 48 секунд
если без ремува, а ставить просто трейс все окей, ошибок нет. вывод верный
__________________
Марк Tween

Старый 25.07.2011, 15:27
bav вне форума Посмотреть профиль Отправить личное сообщение для bav Найти все сообщения от bav
  № 9  
Ответить с цитированием
bav
 
Аватар для bav

Регистрация: Oct 2010
Сообщений: 1,049
Отправить сообщение для bav с помощью ICQ
Код AS3:
(co as Coin)
может вернуть null, если co не Coin.
Код AS3:
var co:DisplayObject = _TB.getChildAt(i);
if (co is Coin)
    if ((co as Coin).code == _serverBetCode)
        _TB.removeChildAt(i--);

Старый 25.07.2011, 15:32
Dweem вне форума Посмотреть профиль Отправить личное сообщение для Dweem Найти все сообщения от Dweem
  № 10  
Ответить с цитированием
Dweem
 
Аватар для Dweem

Регистрация: Dec 2006
Адрес: 66°32′00″ с. ш. 66°38′00″ в. д.
Сообщений: 85
Код AS3:
var i:int = container.numChildren
while(i--){
	if(container.getChildAt(i) is NewClass && (container.getChildAt(i) as NewClass).code == _serverBetCode)
		container.removeChildAt(i);
}

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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