如何将movieClip的所有子节点放入数组中?

时间:2011-07-11 04:11:36

标签: arrays flash actionscript-3 programming-languages

我有一个movieClip容器,我想把它的所有子节点都移动到一个数组中。 我想一下我用来删除容器的所有子容器的方法,使用while和removechild在0,但我认为它不会在这种情况下工作。有人有解决方案吗? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

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!孩子们现在是所有parObj孩子的阵列

作为一个功能:

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
}

或者,如果你对矢量有足够的勇气(这个函数的结果只能容纳DisplayObjects,它比普通数组略快):

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
}

修改

有人指出,这个循环并没有优化numChildren。我同意(在合理范围内 - 这可能不会成为瓶颈),所以它现在是一个int。 SOer的一个好点。

但是,针对推文与kids[ kids.length ] = parObj.getChildAt( i );

进行了两次评论

在分配数组索引时,我的经验是pusharr[ i ] = val真正产生很大差异的情况,很可能还会发生其他应该优化的事情首先 - 你真的得到一个数百(数千?)次的MovieClip的孩子阵列?那么也许你真的不需要一个DisplayObject数组,也许你需要删除额外的循环并处理所有这些(或多或少)内联。你真的有一千个长度阵列吗?那么你的瓶颈可能与你正在处理一个庞大的,笨拙的数据结构而不是循环本身的事实有关。

我发现push清晰,明确,最重要,最明显。 arr.push没时间理解,它是一个自包含的语句,而数组索引赋值至少要求我实际查看。此外,由于push是方法调用而arr.length是动态对象的属性,push也可以防止拼写错误的可能性:arr[ arr.lengt ]不会导致错误!这是有效的代码!另一方面,arr.pus(value)会导致TypeError。不知道世界其他地方,但我没有时间处理模糊不清的错别字。

直接为我分配数组索引是过早的优化。如果您不这么认为,那很好(并且无论如何,请投票给我,这是网站的重点 - 希望我们都同意一个可接受的做法),但push将是我的标准。 / p>

答案 1 :(得分:0)

您可以使用numChildrengetChildAt()的组合来遍历容器中的元素。以下代码假定您正在容器中运行代码。如果不是这种情况,只需在这两个属性前加上容器名称:

var ar:Array = [];

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

    ar[ar.length] = mc;
}

trace(ar.length);