2012-03-01 12 views
0

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

これをテストするために、すばやく汚れた機能を書きました。トレース中、私はステージのトップに近づくとトラックのインデックスが0になることに気づきましたが、私があまりにも遠くに行くとステージから完全に消えてしまいます。その後、トレースすると、このエラーを生成を開始:theTruckはプレイヤー制御車両 敵のムービークリップ、コーンです

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()

、岩はそれらの

なしイベントリスナーを持っていないムービークリップを含むすべての配列です。

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()を使用すると、自動的に次に深い深さに再追加されます。また、それは最初に少し無駄だ

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

drawableObjects.sortOn("y"); 

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

ありがとうございました。私はそれを掘り下げてしまいました。このコードはトラックが最初に消えてしまうことさえありません。私はまだこの方法を使用するつもりです。 –

0

使用setChildIndex代わりに削除して再追加する:あなたはこのような何かをするだけ必要があります、と述べ

降順で並べ替えを並べ替え、次に配列を逆順に並べ替えます。それを昇順に並べ替えて、始めましょう!

関連する問題