0

各 mcの z位置に従って選択されるムービークリップの積み重ね順序 (z index )を設定しようとしています。

取得している外部データから axyz 位置を指定して、何百もの mcs を取得しています。すべてが適切に配置されていますが、スタック順序はデフォルトでループ内の各 mc の出現順序として設定されています。

私が本当に追求したくない不快なオプションの 1 つは、mcs をループに接続する前に、z 位置に従ってデータをソートすることです。

これを行うためのより迅速でエレガントな方法はありますか?

助けてくれてありがとう

4

2 に答える 2

2

sortOnMovieClips の配列をzプロパティで並べ替えてから、説明したようなループを使用してそれらをすべてコンテナーに追加することができます。これはおそらく、これを行うための最もクリーンでエレガントな方法です。

listMovieClips を含む配列があると仮定します。

// Sort the list and add the children.
list.sortOn("z", Array.NUMERIC);
for each(var i:DisplayObject in list)
{
    addChild(i);
}

順序が間違っている場合はlist.reverse()、for ループの前に追加してください。

0 から 1000 の間でランダムに生成されたz値を持つ 1000 個のスプライトを使用すると、私のマシンではこのプロセスに 3 ミリ秒かかります。これは例外的です。

于 2013-03-27T22:07:30.250 に答える
0

アイテムがすべて共通の親の子である場合、次のようにすることができます。

function goSort(container:DisplayObjectContainer):void {
    var list:Vector.<DisplayObject> = new Vector.<DisplayObject>();
    var i:int = container.numChildren;
    while(i--){
        list.push(container.getChildAt(i));
    }

    list.sort(sortZ);

    for(var i:int=0;i<list.length;i++){
        container.addChild(list[i]);
    }
}

function sortZ(a:DisplayObject, b:DisplayObject):Number {
    return a.z - b.z;
}

次に呼び出します。

goSort(yourContainer);
于 2013-03-27T22:54:53.773 に答える