根据z位置as3排序堆叠顺序

时间:2013-03-27 22:03:29

标签: actionscript-3 3d indexing position

我正在尝试根据每个mc的z 位置设置动画片段的堆叠顺序(z 索引)。

我有数百个mcs,每个mcs从我检索的外部数据给出一个x y z位置。 一切都定位好但堆叠顺序 - 默认设置为循环中每个mc的外观顺序。

我真正希望追求的一个令人不舒服的选择是在将mcs连接到循环之前根据z位置对数据进行排序。

有更快,更优雅的方式吗?

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

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

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

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

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

1000个Sprites的随机生成z值介于0到1000之间,这个过程在我的机器上需要3ms,这是特殊的。

答案 1 :(得分: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);