我正在尝试根据每个 mc的 z位置设置要选择的动画剪辑的堆叠顺序(z index )。
我有数百个 mcs,每个 mcs 从我正在检索的外部数据中给出 axyz 位置。除了堆叠顺序之外,所有东西都放置得很好——默认情况下,它被设置为我循环中每个 mc 的出现顺序。
我真的不想追求的一个不舒服的选择是在将 mcs 附加到循环中之前根据 z 位置对数据进行排序。
有没有更快、更优雅的方法来做到这一点?
谢谢您的帮助
我正在尝试根据每个 mc的 z位置设置要选择的动画剪辑的堆叠顺序(z index )。
我有数百个 mcs,每个 mcs 从我正在检索的外部数据中给出 axyz 位置。除了堆叠顺序之外,所有东西都放置得很好——默认情况下,它被设置为我循环中每个 mc 的出现顺序。
我真的不想追求的一个不舒服的选择是在将 mcs 附加到循环中之前根据 z 位置对数据进行排序。
有没有更快、更优雅的方法来做到这一点?
谢谢您的帮助
您可以使用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 毫秒,这是非常特殊的。
如果您的项目都是共同父母的孩子,您可以这样做:
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);