【问题标题】:Changing Child Index of MovieClips based on their Y Position?根据其 Y 位置更改 MovieClip 的子索引?
【发布时间】:2012-03-01 06:53:17
【问题描述】:

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

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

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

theTruck 是玩家控制车辆的影片剪辑 Enemies, Cones, Rocks 都是包含 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]);
        }
    }

【问题讨论】:

    标签: arrays actionscript-3 flash removechild addchild


    【解决方案1】:

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

    也就是说,您只需要执行以下操作:

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

    【讨论】:

    • 谢谢,我已经搞砸了,结果发现这段代码甚至不负责让卡车消失。不过我还是会改用这个方法。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 2021-08-30
      • 1970-01-01
      • 2011-12-12
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多