每当玩家的y值和对象发生变化时,我都会使用自动显示代码来交换我的孩子。因此,当玩家落后于一个物体时,该物体会在玩家身上移动,而玩家会在下方移动。反之亦然。
然而,我有GUI的十字准线,按钮,屏幕上的健康栏应始终位于舞台上的对象之上。因此,例如,如果玩家显示在一个物体上方,并且我移动我的十字准线,十字准线的y值将改变,然后干扰玩家和物体,那么玩家将以某种方式在物体后面显示它不应该至。
public class DepthSortSpace extends MovieClip {
public function DepthSortSpace() {
super();
this.addEventListener( Event.ADDED_TO_STAGE, this.addedToStage, false, 0, true );
}
private function addedToStage( e:Event ) {
this.stage.addEventListener( Event.ENTER_FRAME, this.enterFrame, false, 0, true );
}
private function sortDisplayList():void {
var len:uint = numChildren;
var i,j;
for( i=0; i < len-1; i++ )
for (j=i+1; j < len; j++)
if ( getChildAt(i).y > getChildAt(j).y ) this.swapChildrenAt( i, j );
}
private function enterFrame(e:Event) {
//always put crosshair on top
swapChildren(crosshair, getChildAt(numChildren - 1));
this.sortDisplayList();
}
}
}
请告诉我如何制作它以便GUI和十字准线被忽略并始终保持最重要的一切,只有当y值发生变化时,玩家和对象才会互动和交换。
我尝试了Aaron的方法1回答。
private function sortDisplayList(): void
{
var alwaysOnTop:Array = new Array();
alwaysOnTop = [crosshair];//this should always stay on top but then flickers with the player.
var len: uint = numChildren;
var i, j;
for (i = 0; i < len - 1; i++)
for (j = i + 1; j < len; j++)
if (getChildAt(i).y > getChildAt(j).y || alwaysOnTop.indexOf(getChildAt(i)) > -1 ) swapChildrenAt(i, j);
}
答案 0 :(得分:3)
您有两种选择:
调整排序逻辑以始终将某些对象置于顶部。例如:
private var alwaysOnTop:Array = [crosshair, player, gui];
private function sortDisplayList(): void {
var sortableChildren:Array = [];
for(var i:int = 0; i < numChildren; i++){
var child:DisplayObject = getChildAt(i);
if(alwaysOnTop.indexOf(child) == -1)
sortableChildren.push(child);
}
sortableChildren.sortOn("y", Array.NUMERIC);
for(i = 0; i < sortableChildren.length; i++){
setChildIndex(sortableChildren[i], i);
}
}
将所有已排序的对象放在容器中,并将容器外的“始终在顶部”对象放入容器中。 (这是我更喜欢的方法。)只需对各种容器使用现有的排序逻辑,然后根据需要对容器进行分层。