2

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?

Electriczap4
  • 47
  • 1
  • 6

2 Answers2

4

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.

Taurayi
  • 3,209
  • 2
  • 17
  • 15
  • I'm confused as to why this got a vote down, it would be nice if the person who voted it down could give a reason so I could make the appropriate amendments to my answer. – Taurayi May 22 '11 at 19:44
  • @frankhermes its so that people can simply copy and paste the code in my answer into their document class and run it. Also its easier to understand an explaination that has a practical application of it in my opinion. – Taurayi May 22 '11 at 20:03
  • but you could only show interesting part of the code (getCircles for example) and paste the full code on gist.github.com (for clarity purpose) – OXMO456 May 22 '11 at 21:15
2

I'm not going to do your job for you but I can give you a hint:

you can check if something is a myCircle instance by doing

if(child is myCircle)

so when you loop through all children of the stage you can put the children that ARE instances of myCircle into the array and if not, do nothing. That will give you an array of all children that are myCircles.

frankhermes
  • 4,720
  • 1
  • 22
  • 39