Astro ビルトインによる 3D 表現の模索(3)~Zソート<2>~
2008/05/31 23:31 - Astro
前回は CS3 での 3D 表現における Zソートの話でした。 今回は Astro でのZソートの話。
CS3 では Array を使って表示オブジェクトとZ座標を管理しましたが、Astro だったら Vector 使わなきゃね、ってことで、これが第一番目の変更点。
では Astro の ASDoc を見てみましょう。
Array にはソート関連のメソッドとして sort と sortOn という二つのメソッドがあります。しかし Vector はと見てみると sort メソッドしかないじゃあありませんか。
ここで第二番目の変更点が緊急浮上。
sortOn メソッドがないなら sort メソッドを使えばいいじゃない(マリー・アントワネットの声で読もう)、ってなわけで Vector.sort の項を読んでみましょう。
Vector.sort は Array.sort と同じですね。 ただし Array.sort では第2引数でソートオプションを指定できましたが、Vector.sort に第2引数はありません。
で、第1引数であるユーザ定義比較関数の仕組みは Array.sort、Vector.sort 共通です。 なんだ簡単じゃん。
Astro におけるZソートは以下のようなコードでたぶんオッケー。
以下のコードの前提条件は三つ。
- 3D 空間上に配置される表示オブジェクトは Shape とする
- それらの Shape は container という表示オブジェクトコンテナに addChild
- それらの Shape は vecFace という Vector に格納して管理
private function zsort():void { // 表示オブジェクト Vector をソート vecFace.sort( compare ); // 表示オブジェクトの重なり順を変更 var num:uint = vecFace.length; var i:int = num; while( i-- ) { container.setChildIndex( vecFace[i], num-1 ); } } // 比較メソッド private function compare( x:Shape, y:Shape ):Number { return x.z - y.z; }
compare メソッドは x.z - y.z を返しています。 こうすることで昇順ソートになるわけですね。 なんで昇順になるのか、という理由は Vector.sort の第1引数である比較関数の仕様を読めば分かります。
昇順なので Vector 配列の後ろの要素から setChildIndex をおこなうことで、正しい重なり順に表示することができます。
逆に setChildIndex を Vector 配列の前の要素からおこないたい場合は、compare メソッドで y.z - x.z を返すようにして降順ソートしたら良いわけです。
さて。 Zソートの機構もできたことですし、いよいよ Astro ビルトインで 3D 表現のコーディングに話を進めたいと思います。
なお、シリーズ名が長ったらしいので 次回からは「Astro de 3D」に改題します。