0

関連するすべてのムービー クリップを Y 位置に基づいて昇順に描画することで被写界深度をシミュレートしようとする Flash CS5/AS 3.0 を使用したゲームを作成しています。したがって、Y 位置が 10 の MovieClip は、Y 位置が 20 の MovieClip よりも低いインデックスを持つ必要があるため、2 番目のものは最初のものの上に描画されます。

これをテストするためだけに、簡単で汚い関数を書きました。トレース中、ステージの最上部に近づくとトラックのインデックスが 0 になることに気付きましたが、上に行きすぎると完全にステージから消えてしまいます。次に、トレースが次のエラーの生成を開始します。

ArgumentError: エラー #2025:指定された DisplayObject は呼び出し元の子でなければなりません。
        flash.display::DisplayObjectContainer/getChildIndex()
        EICT::Game/ReorganizeDisplayIndexes()
        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]);
        }
    }
4

2 に答える 2

1

ヒント: 最初に子を削除する必要はありません。オブジェクトで使用するaddChild()と、次に高い深度に自動的に再追加されます。

そうは言っても、次のようなことをするだけです:

drawableObjects.sortOn("y");

for each(var i:DisplayObject in drawableObjects)
{
    if(i.parent)
        i.parent.addChild(i);
}
于 2012-03-01T07:03:22.457 に答える
0

削除して再度追加する代わりに、setChildIndex を使用します。

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

また、最初に配列を降順で並べ替えてから逆順に並べ替えるのは少し無駄です。まずは昇順で並べ替え!

于 2012-03-01T09:15:00.273 に答える