我正在尝试根据每个mc的z 位置设置动画片段的堆叠顺序(z 索引)。
我有数百个mcs,每个mcs从我检索的外部数据给出一个x y z位置。 一切都定位好但堆叠顺序 - 默认设置为循环中每个mc的外观顺序。
我真正希望追求的一个令人不舒服的选择是在将mcs连接到循环之前根据z位置对数据进行排序。
有更快,更优雅的方式吗?
感谢您的帮助
答案 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);