根据Y位置更改MovieClip的子索引?

时间:2012-03-01 06:53:18

标签: arrays actionscript-3 flash removechild addchild

我正在用Flash CS5 / AS 3.0编写一款游戏,它试图通过按照Y位置按升序绘制所有相关的电影剪辑来模拟景深,即舞台上较低的东西在舞台上重叠较高的东西。因此,Y位置为10的MovieClip与Y位置为20的MovieClip相比需要具有较低的索引,因此第二个将在第一个上方绘制。

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

  

ArgumentError:错误#2025:提供的DisplayObject必须是调用方的子级。
  在flash.display :: DisplayObjectContainer / getChildIndex()
  在EICT :: Game / ReorganizeDisplayIndexes()
  在EICT :: Game / loop()

theTruck是玩家控制的车辆的MovieClip 敌人,视锥细胞,岩石都是包含MovieClips的数组

他们都没有事件监听器。

    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]);
        }
    }

2 个答案:

答案 0 :(得分:1)

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

那就是说,你只需要这样做:

drawableObjects.sortOn("y");

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

答案 1 :(得分:0)

使用setChildIndex而不是删除和重新添加:

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

此外,首先按降序排序然后反转数组有点浪费。按升序排序以开始!