2012-03-01 49 views
0

我正在用Flash CS5/AS 3.0编写游戏,试图通过基于Y位置的升序来绘制所有相关的电影剪辑来模拟景深,也就是说舞台上较低的东西与舞台上的东西重叠。因此,与Y位置为20的MovieClip相比,Y位置为10的MovieClip因此需要较低的索引,因此第二个位于第一个位置上。基于Y位置更改动画片段的子索引?

我写了一个快速而脏的函数来测试这个。在追踪过程中,我注意到当我靠近舞台顶部时,卡车的索引达到0,但如果我走得太远,它将完全从舞台上消失。跟踪然后开始产生这样的错误:

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
        at flash.display::DisplayObjectContainer/getChildIndex()
        at EICT::Game/ReorganizeDisplayIndexes()
        at EICT::Game/loop()

theTruck是玩家控制的车辆 敌人的电影剪辑,锥,岩石是含有影片剪辑

他们都没有事件侦听所有阵列。

private function ReorganizeDisplayIndexes(): void 
    { 
     var drawableObjects:Array = new Array(); 
     drawableObjects.push(theTruck); 
     drawableObjects = drawableObjects.concat(Enemies, Rocks, Bushes); 
     drawableObjects.sortOn("y", Array.DESCENDING | Array.NUMERIC); 
     drawableObjects.reverse(); 
     trace(collisionLayer.getChildIndex(theTruck)); 
     for (var a:int = collisionLayer.numChildren - 1; a >= 0; a--) 
     { 
      collisionLayer.removeChildAt(a); 
     } 
     for (var i:int = 0; i < drawableObjects.length; i++) 
     { 
      collisionLayer.addChild(drawableObjects[i]); 
     } 
    } 

回答

1

提示:您不需要先移除孩子。当您在对象上使用addChild()时,它会自动重新添加到下一个最高深度。

这就是说,你需要做的仅仅是这样的:不是

drawableObjects.sortOn("y"); 

for each(var i:DisplayObject in drawableObjects) 
{ 
    if(i.parent) 
     i.parent.addChild(i); 
} 
+0

谢谢,我已经绕过它,事实证明,这一点的代码甚至不负责让卡车消失在第一位。但我仍然会使用这种方法。 – 2012-03-01 14:11:28

0

使用setChildIndex删除并重新添加:

for (var a:int = collisionLayer.numChildren - 1; i >= 0; i--) 
{ 
    collisionLayer.setChildIndex(drawableObjects[i], i); 
} 

而且,这是一个有点浪费第一按降序排序然后颠倒数组。按升序排序以开始!