使用z-index 堆栈排序z-buffer
(在 3D 图形文献中也称为)与仅使用 2D 技术创建 3D 深度效果相同。
换句话说,分配给每个对象 azIndex
并定期(例如onEnterFrame
事件)运行一个zsort
例程,该例程根据它们的zIndex
值对显示对象进行排序(顺序)。或者,您可以在zsort
每次zIndex
对象发生更改时手动运行例程。
然后在您的代码中,您只需zIndex
为显示对象分配值,以模拟在另一个对象前面或后面传递的对象并zsort
处理其余部分。
zIndex+1
这里的一个技巧是在对象上分配的值中具有适当的间隙(即不一定是 next ) zIndex
,以便可以将对象放置在这些间隙之间以模拟在其他对象的前面或后面通过,而不必每个调整多个zIndex
值时间,即您只调整在另一个对象前面或后面传递的对象的一个zIndex
zIndex
值,而不是另一个对象的值。
可以根据在任何给定时间可能位于这些对象之间的(其他)对象zIndexes
的最大数量来估计连续之间的间隙量(例如,如果在最大情况下,对象可能在某个时间在这些对象之间移动,在前面或在任何给定的对象后面,那么连续的间隙值将是这样所有的对象都可以容纳)3
zIndexes
3
这是一个非常简单的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
,因为您将显示对象添加到zsorter
movieClip 并且这会相应地对它们进行排序,但是可以只采用zsort
例程并将其应用于任何DisplayObjectContainer
对象Scene
实例。
注意,zsorter
上面使用了一种bubbleSort
排序算法,它具有O(n^2)
复杂性,但可以使用另一种排序算法(例如mergeSort
具有O(n lgn)
复杂性)
示例和参考
- http://nephilim.blogspot.gr/2010/06/easy-depth-sorting-in-actionscript-3.html
- http://www.actionscript.org/forums/actionscript-3-0-a/169035-sorting-technique.html
- http://www.simppa.fi/blog/the-fastest-way-to-z-sort-and-handle-objects-in-as3/