あたごんと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での独自のイベントハンドリングについて説明したいと思います。

あたごんとFlash-as3isolib

今日から、何日間かにわたって、ActionScript3.0(as3)を使ってアイソメトリックな世界を簡単に作れるライブラリー「as3isolib」について解説していきます。
アイソメトリックとは、物体を斜めから見る投影法だそうですが、難しい事はさておき、as3isolibを使うと、次の様な疑似3Dの世界が作れます。

タクティクスオウガ

あたごんとFlash-タクティクス



アメーバぴぐはいわずもがなですね!
as3isolibは使っていないと技術者懇談会で言っていました。
ただ、ちらっと見えたソースの記述がas3isolibに似ていたので、ベースは参考にしているのではないでしょうか。
あたごんとFlash-ぴぐ



変わったところでは、無料英語学習サイト「ココネ 」のアバターサービスまぁるでもアイソメトリック座標系を採用しています。
あたごんとFlash-ココネ



と言ったところで、まずは、ライブラリソースをゲット!
http://code.google.com/p/as3isolib/

「source」タブに書いてあるSVNリポジトリー
http://as3isolib.googlecode.com/svn/trunk/
からチェックアウトするか、

zipで固められている
http://as3isolib.googlecode.com/svn/trunk/fp10/download/as3isolib.v1.core.zip
から手に入れましょう。

展開して、ライブラリにパスを通したら早速「Hello isolib」です。



package
{
import as3isolib.display.primitive.IsoBox;
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.TOP_LEFT;

// 箱を作る
var box:IsoBox = new IsoBox();
// ( x, y, z ) = ( 100, 0, 0 )の位置に移動させる
box.moveTo( 100, 0, 0 );

// アイソメトリックな空間を描画するコンテナ
var scene:IsoScene = new IsoScene();
scene.hostContainer = this;

scene.addChild( box );

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



実行結果はこの通り。
かわいい25px四方の立方体が描画されました。
あたごんとFlash-はこ
19行目のIsoBoxはデフォルトで用意されている直方体が作れるクラスです。
setSizeで縦、横、高さを指定できますが、何も指定しないと25px四方になります。

moveTo( x:Number, y:Number, z:Number ) でアイソメトリック空間を移動させることができます。
これは、

box.x = x;
box.y = y;
box.z = z;

と同じ事です。
 
 
次に、アイソメトリックな空間を計算して描画してくれるIsoSceneの登場です。
hostContainerプロパティで、displayListと繋ぎます。

後は描画したい物体をIsoSceneにどんどんaddChildして、最期にrenderメソッドを呼ぶと描画されます。
renderを呼ばない限り何も表示されません。
 
 
真っ白な空間に箱があるだけでは、いまいちピンと来ないので、グリッドを表示させてみましょう。
便利なIsoGridというグリッドを描画するクラスが用意されています。
左上に描画されると分かりにくいのでちょっと位置をずらします。



package
{
import as3isolib.display.primitive.IsoBox;
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 box:IsoBox = new IsoBox();
// ( x, y, z ) = ( 100, 0, 0 )の位置に移動させる
box.moveTo( 100, 0, 0 );

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

// アイソメトリックな空間を描画するコンテナ
var scene:IsoScene = new IsoScene();
scene.hostContainer = this;

scene.addChild( box );
scene.addChild( grid );

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



実行結果は次の通り
あたごんとFlash-グリッドと箱
何となく、タクティクスオウガのような、ぴぐのような世界がチラ見えて来ました!
ということで、次回に続きます。


次回は、この一風変わったグリッドの座標系について説明していきます。