AS3:如何控制哪个 MovieClip 显示在哪个之上

AS3: How to control which MovieClip is displayed over which

我正在制作一款游戏,其中一些敌人在屏幕右侧生成,然后向屏幕左侧移动。为了获得一点变化,敌人在 y 轴上的随机生成略有不同。

问题: 所以我知道,最后添加的 MovieClip 显示在其他 MovieClip 之上。但我需要一种方法,以便无论何时添加,y 轴较低的 MovieClip 始终显示在 y 轴较高的 MovieClip 之上。 原因是否则它会扰乱游戏中的水平错觉,因为 y 轴上较高的 MovieClip 看起来应该比 y 轴上较低的 MovieClip 看起来更远。

我希望我说得有道理。提前致谢!

您需要根据 y 位置对它们进行排序,然后根据排序顺序在父级中设置它们的索引:

此函数将获取 container/parent 的所有子项,并根据 y 的位置对它们进行排序。

function sortAllZ(container:DisplayObjectContainer):void {
    //build an array of all the objects:
    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.y - b.y;
}

由于您可能每帧都运行此代码(假设您的对象的 y 位置随时间变化),因此保留所有对象的 array/vector 会更有效你想要排序。 (而不是每次要排序时都重新创建一个新的)。如果是这样,你可以这样做:

//where list is your vector/array, and container is the parent of items
function sortAll(){
    //sort the vector/array using the custom sort method defined below
    list.sort(sortZ);

    //now loop through that array and add the children in that order
    for(var i:int=0;i<list.length;i++){
        container.addChild(list[i]);
    }
}

//if you are using an array and not a vector, take out the :DisplayObject type declarations
function sortZ(a:DisplayObject, b:DisplayObject):Number {
    return a.y - b.y;
}