开发者

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

开发者 https://www.devze.com 2023-03-07 11:21 出处:网络
Assume I have the myCircle class all defined and all that. If my code is as follows: var circle1:myCircle = new myCircle()

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.ad开发者_如何学JAVAdChild(circle3)
stage.addChild(circle4)

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


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.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消