0

我正在尝试根据每个 mc的 z位置设置要选择的动画剪辑的堆叠顺序(z index )。

我有数百个 mcs,每个 mcs 从我正在检索的外部数据中给出 axyz 位置。除了堆叠顺序之外,所有东西都放置得很好——默认情况下,它被设置为我循环中每个 mc 的出现顺序。

我真的不想追求的一个不舒服的选择是在将 mcs 附加到循环中之前根据 z 位置对数据进行排序。

有没有更快、更优雅的方法来做到这一点?

谢谢您的帮助

4

2 回答 2

2

您可以使用sortOn按属性对 MovieClip 数组进行排序z,然后使用您描述的循环将它们全部添加到您的容器中。这可能是最干净和最优雅的方法。

list假设您有一个包含 MovieClip的数组:

// Sort the list and add the children.
list.sortOn("z", Array.NUMERIC);
for each(var i:DisplayObject in list)
{
    addChild(i);
}

如果顺序错误,只需list.reverse()在 for 循环之前添加即可。

对于 1000 个 Sprite,其随机生成的z值介于 0 到 1000 之间,这个过程在我的机器上需要 3 毫秒,这是非常特殊的。

于 2013-03-27T22:07:30.250 回答
0

如果您的项目都是共同父母的孩子,您可以这样做:

function goSort(container:DisplayObjectContainer):void {
    var list:Vector.<DisplayObject> = new Vector.<DisplayObject>();
    var i:int = container.numChildren;
    while(i--){
        list.push(container.getChildAt(i));
    }

    list.sort(sortZ);

    for(var i:int=0;i<list.length;i++){
        container.addChild(list[i]);
    }
}

function sortZ(a:DisplayObject, b:DisplayObject):Number {
    return a.z - b.z;
}

然后调用:

goSort(yourContainer);
于 2013-03-27T22:54:53.773 回答