AS3 получить массив всех экземпляров класса на сцене? - PullRequest
2 голосов
/ 22 мая 2011

Предположим, у меня уже есть класс myCircle и все такое.Если мой код выглядит следующим образом:

var circle1:myCircle = new myCircle()
var circle2:myCircle = new myCircle()
var circle3:myCircle = new myCircle()
var circle4:myCircle = new myCircle()

stage.addChild(circle1)
stage.addChild(circle2)
stage.addChild(circle3)
stage.addChild(circle4)

Как мне написать функцию для автоматического возврата массива [circle1, circle 2, circle3, circle4]?

Ответы [ 2 ]

4 голосов
/ 22 мая 2011

Все просто, взгляните на следующее, что я сделал:

package 
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            for (var i:uint = 0; i < 5; i++)
            {
                var circle:Circle = new Circle();
                circle.name = "circle" + (i+1);
                stage.addChild(circle);

            }// end for

            for (var j:uint = 0; j < 5; j++)
            {
                var square:Square = new Square();
                square.name = "square" + (j+1);
                stage.addChild(square);

            }// end for

            traceNames(getCircles(stage)); // output: circle1
                                           //         circle2
                                           //         circle3
                                           //         circle4
                                           //         circle5

            traceNames(getSquares(stage)); // output: square1
                                           //         square2
                                           //         square3
                                           //         square4
                                           //         square5


            traceNames(getChildren(stage, Circle)); // output: circle1
                                                    //         circle2
                                                    //         circle3
                                                    //         circle4
                                                    //         circle5

        }// end function

        private function getCircles(container:DisplayObjectContainer):Array
        {
            var array:Array = new Array();

            for (var i:uint = 0; i < container.numChildren; i++)
            if (container.getChildAt(i) is Circle)
            array.push(container.getChildAt(i));

            return array;

        }// end function

        private function getSquares(container:DisplayObjectContainer):Array
        {
            var array:Array = new Array();

            for (var i:uint = 0; i < container.numChildren; i++)
            if (container.getChildAt(i) is Square)
            array.push(container.getChildAt(i));

            return array;

        }// end function

        private function getChildren(container:DisplayObjectContainer, type:Class):Array
        {
            var array:Array = new Array();

            for (var i:uint = 0; i < container.numChildren; i++)
            if (container.getChildAt(i) is type)
            array.push(container.getChildAt(i));

            return array;

        }// end function

        private function traceNames(array:Array):void
        {
            for each(var displayObject:DisplayObject in array)
            trace(displayObject.name);

        }// end function

    }// end class

}// end package

import flash.display.Sprite;

internal class Circle extends Sprite
{
    public function Circle() {}

}// end class

internal class Square extends Sprite
{
    public function Square() {}

}// end class

Три ключевые функции здесь - это getCircles (), getSquares () и getChildren ().По сути, все они делают одно и то же, в функции есть цикл for, который проходит через потомки указанного контейнера экранного объекта.При каждом взаимодействии он проверяет тип для типов Circle или Square в функциях getCircles() и getSquares() соответственно, а затем добавляет каждый экранный объект в локальный массив, который возвращается функцией.

Функция getChildren() делает шаг вперед, позволяя заранее указать тип.

2 голосов
/ 22 мая 2011

Я не собираюсь выполнять вашу работу за вас, но могу дать вам подсказку:

вы можете проверить, является ли что-то экземпляром myCircle, выполнив

if(child is myCircle)

, поэтому, когдаВы перебираете все дочерние элементы этапа, вы можете поместить в массив дочерние элементы, являющиеся экземплярами myCircle, и, если нет, ничего не делать.Это даст вам массив всех детей, которые являются myCircles.

...