最近在一家创业公司实习做Flash相关的内容,其中遇到个问题是关于2D视角下拖动物体的。这些物体本身都是数据驱动的Sprite,在拖动的时候需要把一些物体放在另一些物体上面。物体的模型数据更改只需要在检测到碰撞时把高度更改一下就好,显示上的更改就涉及到Sprite关于深度的排序问题。
AS3里面对于Sprite的排序取决于其在父节点下的Index,举例来说:
我现在有三个Sprite: rootSprite, childSprite1和childSprite2,childSprite1和childSprite2都是rootSprite的children。其中childSprite1的index是0,childSprite2的index是1。那么在绘制时childSprite2就会画在前景,即可能挡住childSprite1的内容。如果我想要让childSprite1位于前景,就需要改变两者的index顺序。
根据Adobe的API参考文献,在DisplayObjectContainer类(Sprite继承该类)下面提供了几个方法可以用于改变children的index:
public function setChildIndex(child:DisplayObject, index:int):void
该方法是将child移动到index的位置。举例来说:如果我有5个child,分别叫child_0 - child_4,其对应的index从0到4 。如果我调用root.setChildIndex(child_1,3),那么调用之后他们的index则分别为 0 3 1 2 4。也就是说,该方法是将child移动到index位置之后,该child和原index位置的child之间的所有child的index都会发生改变。
public function swapChildrenAt(index1:int, index2:int):void
public function swapChildren(child1:DisplayObject, child2:DisplayObject):void
这两个方法都是将两个child的位置直接交换而不影响其他child的index。还是以上例,如果我调用root.setChildIndex(child_1,3),那么调用之后他们的index则分别为 0 3 2 1 4。