さて、ActionScript3.0(as3)を使ってアイソメトリックな世界を簡単に作れるライブラリー「as3isolib」の解説7回目。
概要やインストール方法については解説第一回目 を見てみてください。
今回は、プログラミングから少し離れて、仕事でas3isolibを使ったときに一度は調査したりいじったりするであろう、前後判定&表示ロジック部分の解説をしたいと思います。
これを理解しておけば、「すいません。なぜか○○の時、後ろに表示されちゃう△△を手前に表示してくれませんか?」なんて言われたときも慌てずに済みます。
その肝心のロジックは
as3isolib.display.renderers
パッケージにある
DefaultSceneLayoutRenderer
クラスの
public function renderScene (scene:IIsoScene):void
に記述されています。
IsoSceneのrenderメソッドを呼ぶ度に、このrenderSceneメソッドが呼ばれます。
処理の流れとしては、
1. 全てのオブジェクト同士を比較して、前後関係を判定
2. 判定結果に合わせて、表示順を変更
となっています。
1. 全てのオブジェクト同士を比較して、前後関係を判定 について
renderSceneメソッドのなかではこのように判定しています。
var rightA:Number = objA.x + objA.width;
var frontA:Number = objA.y + objA.length;
var topA:Number = objA.z + objA.height;
if ((objB.x < rightA) &&
(objB.y < frontA) &&
(objB.z < topA) &&
(i !== j))
{
// AよりBが後ろだと判定したら、配列に入れる
behind.push(objB);
}
width, length, heightや、オブジェクトAの座標(x, y, z)の場所(Aの箱の真ん中にある青い点)、オブジェクトBの座標(x, y, z)の場所(Bの箱の真ん中にある白い点)は次の図の通りです。
これは、要するに、次の様なエリアより、Bの座標が奥だった場合に、AはBより手前。と判定していると言うことです。
今は、丁度 objB.x == objA.x + objA.width
なのでBはAより手前に表示されています。
試しに、objB.xを < objA.x + objA.width な位置に移動してみると。。。
確かにBがAの奥に行きました!
A( x, width ) = ( 25, 50 ) : objA.x + obj.width = 75
B( x ) = ( 70 )
次は、どう効率よく、前後判定結果を描画に反映するかについて説明したいところですが、今日は細々した話が続いたので、次回に説明します!
お楽しみに~