あたごんとFlash-as3isolib


さて、ActionScript3.0(as3)を使ってアイソメトリックな世界を簡単に作れるライブラリー「as3isolib」の解説2回目。
概要やインストール方法については前回の記事 を見てみてください。

今回は、アイソメトリックな空間について説明します。



座標系について
as3isolibで扱う空間は、各軸が90度で交差する直行座標系とは違い、次の様な座標系となります。
以下では、この独特の座標系をIsometric座標系だと長いので、ISO座標系と呼ぶことにします。(本当はなんて呼ぶのかは知りません)
あたごんとFlash
ISO座標系は、IsoGridクラスを使うと簡単に表示できます。
デバッグで大活躍します。
グリッドのサイズはデフォルトで25pxですが、
cellSizeプロパティに値をセットすることで変更できます。



package
{
 import as3isolib.display.scene.IsoGrid;
 import as3isolib.display.scene.IsoScene;
 
 import flash.display.Sprite;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 
 public class HelloIsolib extends Sprite
 {
 public function HelloIsolib()
 {
 stage.scaleMode = StageScaleMode.NO_SCALE;
 stage.align = StageAlign.BOTTOM_RIGHT;
 
 // グリッド
 var grid:IsoGrid = new IsoGrid();
 
 // ISOな空間を描画するコンテナ
 var scene:IsoScene = new IsoScene();
 scene.hostContainer = this;
 
 scene.addChild( grid );
 
 // レンダリングして表示する
 scene.render();
 }
 }
}



IsoMath
直行座標系とISO座標系との橋渡しをするのが、IsoMathクラスです。
IsoMathを使うと簡単に直交座標系の値をISO座標系に変換できます。

Flashには、flash.geomパッケージに、座標を表すPointクラスがありますが、as3isolibには、そのクラスを拡張したPtクラスがありますのでそちらと組み合わせて利用します。

IsoMath.screenToIso( Pt )で、直交座標系からISO座標系の座標を出せます。
試しに直交座標系(50, 50)をISO座標系に変換してみると(75, 25, 0)と出ました。
(赤い点が直交座標系(50, 50)の場所. 座標の原点は共通 )

デフォルトでは、1グリッドが25ピクセルになるので、x軸方向に3マス(25×3=75)、y軸方向に1マス(25×1=25)で合ってそうです。
あたごんとFlash-グリッド上の座標
上の図を出すActionScript3.0(as3)でのソースは次の通り



package
{
import as3isolib.display.scene.IsoGrid;
import as3isolib.display.scene.IsoScene;
import as3isolib.geom.IsoMath;
import as3isolib.geom.Pt;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;

public class GridSample extends Sprite
{
public function GridSample()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.BOTTOM_RIGHT;

// グリッド
var grid:IsoGrid = new IsoGrid();

// ISOな空間を描画するコンテナ
var scene:IsoScene = new IsoScene();
scene.hostContainer = this;

scene.addChild( grid );

// レンダリングして表示する
scene.render();

// 分かりやすい様に点を打っておく
var dot:Sprite = new Sprite();
dot.graphics.beginFill( 0xFF0000 );
dot.graphics.drawCircle( 0, 0, 5 );
dot.x = 50;
dot.y = 50;
addChild( dot );

var pt:Pt = new Pt( 50, 50, 0 );
IsoMath.screenToIso( pt );
trace( pt.x, pt.y, pt.z ); // 75, 25, 0
}
}
}


逆に、IsoMath.IsoToScreen( Pt )で、ISO座標系から直交座標系の座標を出せます。
箱を作って、ISO座標を( 75, 25, 50 )にセット。直交座標系では、( 50, 0 )と出ました。(赤い点)
何か合ってそうです。(もちろん合っています)
あたごんとFlash-グリッド上の点2
package
{
 import as3isolib.core.ClassFactory;
 import as3isolib.display.primitive.IsoBox;
 import as3isolib.display.renderers.DefaultSceneLayoutRenderer;
 import as3isolib.display.renderers.DefaultShadowRenderer;
 import as3isolib.display.scene.IsoGrid;
 import as3isolib.display.scene.IsoScene;
 import as3isolib.geom.IsoMath;
 import as3isolib.geom.Pt;
 
 import flash.display.Sprite;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 
 public class HelloIsolib extends Sprite
 {
 public function HelloIsolib()
 {
 stage.scaleMode = StageScaleMode.NO_SCALE;
 stage.align = StageAlign.BOTTOM_RIGHT;
 
 // グリッド
 var grid:IsoGrid = new IsoGrid();
 
 var box:IsoBox = new IsoBox();
 box.moveTo( 75, 25, 50 );
 
 // ISOな空間を描画するコンテナ
 var scene:IsoScene = new IsoScene();
 // 分かりやすい様に影を表示
 scene.styleRenderers = [ new ClassFactory( DefaultShadowRenderer ) ];
 scene.hostContainer = this;
 
 scene.addChild( grid );
 scene.addChild( box );
 
 // レンダリングして表示する
 scene.render();
 
 var pt:Pt = new Pt( 75, 25, 50 ); // 箱の座標をセット
 IsoMath.isoToScreen( pt );
 trace( pt.x, pt.y ); // 50, 0
 
 // ためしに、50, 0に点を打ってみる
 var dot:Sprite = new Sprite();
 dot.graphics.beginFill( 0xFF0000 );
 dot.graphics.drawCircle( 0, 0, 5 );
 dot.x = 50;
 dot.y = 0;
 addChild( dot );
 }
 }
}


ISO座標系での長さの概念
ISO座標系では、
 ・x座標方向の長さはwidth
 ・y座標方向の長さはlength
 ・z座標方向への長さはheight
という変数で定義します。そして、箱の底の奥が、座標点となります。
上の箱に赤い点が入っている図を見ると、確かに赤い点が箱の底の奥あたりを指していますね。

as3isolibのブログに貼ってある図が分かりやすくて、慣れるまでは毎日見ていたので、こちらにも貼っておきます。

あたごんとFlash-各パラメータの図



といったところでISO座標系の説明はおしまいです!
次回は、as3isolibでの独自のイベントハンドリングについて説明したいと思います。