AS3 - 如何在不干扰GUI的情况下交换显示对象?

时间:2016-01-08 14:03:33

标签: actionscript-3

每当玩家的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);
    }

1 个答案:

答案 0 :(得分:3)

您有两种选择:

  1. 调整排序逻辑以始终将某些对象置于顶部。例如:

    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);
        }
    }
    
  2. 将所有已排序的对象放在容器中,并将容器外的“始终在顶部”对象放入容器中。 (这是我更喜欢的方法。)只需对各种容器使用现有的排序逻辑,然后根据需要对容器进行分层。