Search code examples
actionscript-3functioninstances

AS3 get an array of all instances of a class on a stage?


Assume I have the myCircle class all defined and all that. If my code is as follows:

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)

How would I write a function to return an array of [circle1, circle 2, circle3, circle4] automatically?


Solution

  • It's simple, take a look at the following I made:

    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
    

    The three key functions here are getCircles(), getSquares() and getChildren(). They all essentially do the same thing, theres a for loop in the function that loops through a specified display object container's children. Upon each interation it checks the type for either Circle or Square types in the getCircles() and getSquares() functions respectively, and then it adds each display object to a local array which is returned by the function.

    The getChildren() function takes things a step further by allowing for the type to be specified beforehand.