AS3在舞台上获取一个类的所有实例的数组?

时间:2011-05-22 18:03:34

标签: actionscript-3 function instances

假设我已经定义了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 个答案:

答案 0 :(得分:4)

这很简单,看看我做的以下内容:

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循环遍历指定的显示对象容器的子节点。在每次交互时,它分别检查CircleSquare函数中getCircles()getSquares()类型的类型,然后将每个显示对象添加到本地数组由函数返回。

getChildren()函数允许事先指定类型,从而更进一步。

答案 1 :(得分:2)

我不打算为你做你的工作,但我可以给你一个提示:

你可以通过

检查某些东西是否是myCircle实例
if(child is myCircle)

所以当你循环遍历舞台的所有孩子时,你可以把那些ARE实例myCircle的子节点放入数组中,如果没有,就什么也不做。这会给你一个包含myCircles的所有孩子的数组。