开发者

how can i put all the children of a movieClip into an Array?

I have an movieClip Container and I want to move all开发者_如何学Go its children into an Array. i think about the method I used to delete all children of a container by using while and removechild at 0, but I think it wont work in this situation. Anyone have a solution? thanks for your help.


var parObj:DisplayObjectContainer = Container; /* Is that the name of your MC? */
var kids:Array = []
var kidCount:int = parObj.numChildren;
// please see note on push at bottom
for( var i:int = 0; i < kidCount; i++ ) kids.push( parObj.getChildAt( i ) );

TA-DA! kids is now an array of all children of parObj

as a function:

function getChildren( parObj:DisplayObjectContainer ):Array
{
    var kids:Array = []
    var kidCount:int = parObj.numChildren;
    for( var i:int = 0; i < kidCount; i++ ) 
        kids.push( parObj.getChildAt( i ) );
    return kids
}

Or, if you're courageous enough for vectors (the result of this function can only hold DisplayObjects and it is slightly faster than a normal array):

function getChildren( parObj:DisplayObjectContainer ):Vector.<DisplayObject>
{
    var Vector.<DisplayObject> = new Vector.<DisplayObject>();
    var kidCount:int = parObj.numChildren;
    for( var i:int = 0; i < kidCount; i++ ) 
        kids.push( parObj.getChildAt( i ) );
    return kids
}

EDIT

It was pointed out that this loop was not optimizing numChildren. I will agree (within reason -- chances are this will not be a bottleneck), so it is now an int. A good point to that SOer.

But, there have been two comments made vis-a-vis push vs. kids[ kids.length ] = parObj.getChildAt( i );

When it comes to assigning array indexes, my experience is that situations where push vs. arr[ i ] = val truly make that much of a difference, it is likely that something else is going on which should be optimized first -- are you really getting an array of the children of a MovieClip hundreds (thousands?) of times? Then maybe you don't really need an array of DisplayObject, maybe you need to remove the extra loop and handle all of this (more or less) inline. Do you really have a thousand length array? Then your bottleneck is probably going to be related to the fact that you're dealing with a large, unwieldy data structure and not the loop in itself.

I find push to be clear, explicit, and most important, obvious. arr.push takes no time to understand, it is a self-contained statement, whereas array index assignment requires me, at least, to actually look. Further, because push is a method call and arr.length is a property of a dynamic object, push also defends against the possibility of typos: arr[ arr.lengt ] causes no errors! It is valid code! arr.pus(value), on the other hand, causes a TypeError. Don't know about the rest of the world, but I don't have time to deal with obscured typos.

Assigning array indexes directly, to me, is premature optimization. If you feel otherwise, that's fine (and by all means, vote me down, that is the point of the site -- hopefully we'll all agree on an acceptable practice), but push will be my standard.


You can use a combination of numChildren and getChildAt() to loop through your elements within a container. The following code assumes that you're running the code from within the container. If this isn't the case, just prefix those two properties with the name of your container:

var ar:Array = [];

var i:int = 0;
for(i; i<numChildren; i++)
{
    var mc:DisplayObject = getChildAt(i);

    ar[ar.length] = mc;
}

trace(ar.length);
0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜