Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   for each глючит? (http://www.flasher.ru/forum/showthread.php?t=150222)

3Desian 08.02.2011 13:50

for each глючит?
 
Есть мувик (m1) в котором мувик (m2), в котором мувики (aaa,bbb).
Пишу в первом кадре каждого мувика по очереди:
Код AS3:

for each ( var obj:Object in this)
{
        trace("Объект="+obj);
 
}

в итоге Flash CS5 пишет болт, извините за жаргон. :)
Почему?
Должен же отображать объекты.

i.o. 08.02.2011 13:58

С чего бы это?
Эти мувики - объекты времени компиляции, поэтому ничего и не выводит.

CrazyFlasher 08.02.2011 14:00

я так понимаю вы хотите пробежаться по DisplayObject'ам родителя?
вот пример:
Код AS3:

public static function getAllChildren(container:Sprite):Array {
                        var allChildren:Array = new Array();
                        var l:uint = container.numChildren;
                        while (l--) {
                                allChildren.push(container.getChildAt(l));
                        }
                        return allChildren;
                }


3Desian 08.02.2011 14:09

Я хочу пройтись по чайлдам мувика и подписать их на события КЛИК.
Через for each проще, нежели через дополнительный массив из которого потом доставать.
Но странность заключается в том, что в другом аналогичном примере всё срабатывает через for each, но только на уровне первого мувика. Т.е. я в мувике m1 пишу код в первом кадре и в итоге трейсятся его чайлды.

in4core 08.02.2011 14:09

Крейзи. Ваш метод не пройдет. Здесь нужно создавать вложенные циклы. В данный момент у вас реализация на детей одного родителя, а вы не рассматриваете случай, когда у детей родителя тоже есть дети, они сами родители .... и т.д. ))

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

for each ( var obj:DisplayObject in this)
{
        if(obj is MovieClip) trace ((obj as MovieClip).name)
 
}

Поробуй чтоль

3Desian 08.02.2011 14:22

Не работает так же , как и мой код :)
А ещё странно, что он таки определяет колличество чайлдов:
Код AS3:

var ob:MovieClip = this.getChildByName("m1") as MovieClip;
trace(ob.numChildren); //выдаёт 1, т.к. один объект там "m2"


derhab 08.02.2011 14:32

in4core, через for each нельзя достать детей у DisplayObjectContainer


3Desian, юзайте numChildren и for
Код AS3:

var len:int = this.numChildren;
for ( var i:int = 0; i < len; i++){
        trace(this.getChildAt(i))
}


etc 08.02.2011 14:38

for each перечисляет только динамические свойства.

-De- 08.02.2011 14:42

Ну есть же разница между ребёнком и внуком. Внук - не твой ребёнок!
Код AS3:

public static function getAllChildren(container:DisplayObjectContainer):Array {
                        var l:uint = container.numChildren;
                        while (l--) {
                                var child:DisplayObject = container.getChildAt(l);
                                child.getChildAt(l).addEventListener(MOUSE_EVENT.CLICK, YaNeNorkomanNet);
                                if(child is DisplayObjectContainer) getAllChildren(child as DisplayObjectContainer);
                        }
                }


3Desian 08.02.2011 14:49

Спасибо, добрые люди. Помог метод CrazyFlasher.

in4core 08.02.2011 17:31

Черт ребятушки, а чтоже мы про for in просто забыли ?))

Код AS3:

for  ( var i:* in this)
{
        if(i is MovieClip) trace ((i as MovieClip).name)
 
}

lol ))

CrazyFlasher 08.02.2011 17:47

он не протрейсит динамично созданный MovieClip

in4core 08.02.2011 17:57

чей то?

CrazyFlasher 08.02.2011 17:59

свой
Код AS3:

package {
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author Anton Nefjodov
        */

        public class Main extends Sprite {
                public var mc:MovieClip;
 
                public function Main():void {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        mc = new MovieClip();
                        addChild(mc);
 
 
                        //fail
                        for (var i:* in this) {
                                trace("test " + i);
                        }
                }
 
        }
 
}


in4core 08.02.2011 18:03

А у меня трейсит))


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

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