1

我有一个 2.5D 游戏(类似于 3D 游戏的 2D 游戏),您可以在其中不断切换深度,当玩家走在对象前面时,它会显示在对象的顶部,当它走在对象后面时,对象会显示在顶部的播放器。就像当玩家的 y 小于对象的 y 时,玩家会落后于对象,反之亦然。

我尝试使用这样的代码:

if (player.y < block.y)
{
    setChildIndex(block, numChildren - 5);
}
else if (player.y > block.y)
{
    setChildIndex(block, numChildren - 10);
}

但是,如果我多次这样做,我将需要大量代码,并且显示列表会混淆并以错误的顺序对错误的深度进行排序。有人可以用最少的代码展示一个有组织的深度改变器吗?

4

1 回答 1

1

使用z-index 堆栈排序z-buffer(在 3D 图形文献中也称为)与仅使用 2D 技术创建 3D 深度效果相同。

换句话说,分配给每个对象 azIndex并定期(例如onEnterFrame事件)运行一个zsort例程,该例程根据它们的zIndex值对显示对象进行排序(顺序)。或者,您可以在zsort每次zIndex对象发生更改时手动运行例程。

然后在您的代码中,您只需zIndex为显示对象分配值,以模拟在另一个对象前面或后面传递的对象并zsort处理其余部分。

zIndex+1这里的一个技巧是在对象上分配的值中具有适当的间隙(即不一定是 next ) zIndex,以便可以将对象放置在这些间隙之间以模拟在其他对象的前面或后面通过,不必每个调整多个zIndex值时间,即您只调整在另一个对象前面或后面传递的对象的一个zIndexzIndex​​值,而不是另一个对象的值。

可以根据在任何给定时间可能位于这些对象之间的(其他)对象zIndexes的最大数量来估计连续之间的间隙量(例如,如果在最大情况下,对象可能在某个时间在这些对象之间移动,在前面或在任何给定的对象后面,那么连续的间隙值将是这样所有的对象都可以容纳)3zIndexes3

这是一个非常简单的zsorter例程,它定期运行onEnterFrame事件并为您进行必要的深度排序(来自下面的参考 1.)

package {

 import flash.display.*;
 import flash.events.*;

 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) {
   this.sortDisplayList();
  }

 }
}

zsorter上面实际上是一个movieClip充当容器的a scene,因为您将显示对象添加到zsortermovieClip 并且这会相应地对它们进行排序,但是可以只采用zsort例程并将其应用于任何DisplayObjectContainer对象Scene实例。

注意zsorter上面使用了一种bubbleSort排序算法,它具有O(n^2)复杂性,但可以使用另一种排序算法(例如mergeSort具有O(n lgn)复杂性)

示例和参考

  1. http://nephilim.blogspot.gr/2010/06/easy-depth-sorting-in-actionscript-3.html
  2. http://www.actionscript.org/forums/actionscript-3-0-a/169035-sorting-technique.html
  3. http://www.simppa.fi/blog/the-fastest-way-to-z-sort-and-handle-objects-in-as3/
于 2015-12-30T11:50:18.253 回答