我目前正在将我的CPU映像后处理帧从AS2移动到AS3。我使用数组来处理每帧需要渲染的所有对象。 我按照_root上对象的深度对数组进行排序,然后将它们全部渲染到一个bitmapdata上,以便按正确的顺序绘制它们。
在我的AS3游戏项目中,我使用displayobjectcontainers来处理“深度”。例如,我有多个动画片段作为MovieClip(root)上的容器,然后将子项添加到那些动画片段以对它们进行排序。我在这些容器中也有其他子容器,形成层次结构。
但是现在我发现很难对渲染列表数组进行排序,因为我不能简单地为对象输入绝对的“深度”值。我使用parent.getChildIndex,但这只是给了我其中一个容器中的子索引。
当然你可以创建一个大函数并最终对数组进行排序,但无论如何都要提供对象的根/阶段的绝对索引?
非常感谢。
答案 0 :(得分:1)
您可以尝试这样的事情,它将从给定的DisplayObjectContainer
开始,并按深度顺序生成所有后代的列表:
function collateChildren(container:DisplayObjectContainer):Vector.<DisplayObject>
{
var list:Vector.<DisplayObject> = new <DisplayObject>[];
for(var i:int = 0; i < container.numChildren; i++)
{
var child:DisplayObject = container.getChildAt(i);
if(child is DisplayObjectContainer && (child as DisplayObjectContainer).numChildren > 0)
{
// Target contains additional children.
list = list.concat(collateChildren(child as DisplayObjectContainer));
}
else
{
// Target is a child.
list.push(child);
}
}
return list;
}
这不包括包含其他孩子的孩子,可以像:
一样使用var children:Vector.<DisplayObject> = collateChildren(stage);
trace(children);
答案 1 :(得分:0)
游戏世界将包含一些层,如角色层,地图层,每个层都有它在游戏世界中的深度。当您尝试向世界添加一些displayobjects时,将displayobjects添加到目标图层。
在大多数情况下,图层数量不会很大,例如5或6.因此,您可以按图层深度在每个图层上绘制对象。