GameProgrammar's Night

ゲームプログラム系の覚え書き

PSMのGameEngine2D TIPS

 PlayStationMobileには2D描画の仕組みとしてGameEngine2Dが提供されています。が、触って見ると意外と曲者です。2D描画として直感的に使えるようにするためのTIPSを紹介します。
 GameEngine2Dそのものについては、PSMのドキュメントを参照して下さい。

スクリーン座標指定で描画できるようにするには

 GameEngine2Dではデフォルトがスクリーン中央が原点、(-1,-1)~(1,1)範囲を取る3Dスクリーン座標系になっています。これをまず左上原点、右下がスクリーンサイズの座標系で座標を指定できるようにします。

var gc = new GraphicContext();
var fb = gc.GetFrameBuffer();

var root = new Scene();
var camera = root.Camera as Camera2D;

camera.SetViewFromeHeightAndCenter(gc.Height, new Vector2(fb.Width/2, -fb.Height/2));

 これで、左上原点、右下スクリーンサイズの座標系になります。ただし、Y座標の軸反転はされないので、下方向はマイナスになりますので注意して下さい。Y座標指定は、マイナスの値で行うということです。
 Cameraクラスに直接行列をセットできればY軸反転も出来るのですが、行列自体を設定する方法は今の所ないようです。

テクスチャ座標は左下原点で扱われる

 テクスチャ座標は左下原点で扱われます。そのため、テクスチャの部分を切り抜いて描画する時に上手く表示されなかったら、左上原点のつもりでUV座標を設定していなか確認してましょう。

Sprite系クラスにテクスチャをセットしたら、ローカルスケールを描画するスプライトサイズにする

 Sprite系クラスは、ローカル空間(Quadプロパティ)を持っています。スプライト内に描画原点を持てたりと便利ではあるのですが、デフォルト値の選び方が今一つで、Sprite系クラスにテクスチャをセットするだけでは絵が出て来ません。
 テクスチャを設定したら、ローカルスケール値もスプライトサイズに合わせた値を入れます。

var sp = new SpriteUV(new TextureInfo("toaru.png"));
sp.Quad.S = sp.TextureInfo.TextureSizef; // これを忘れずに!
                                         // UVを指定する場合はそれも考慮にいれたサイズ

 少し検証した結果、どうやら最終的な描画サイズは「SpriteUV.Scale * SpriteUV.Quad.S」で計算されるようです。SpriteUV.Scaleも、SpriteUV.Quad.Sも、(1.0,1.0) のデフォルト値が入っているため、何もしないと描画サイズが1×1で表示されてしまいます。
 SpriteUV.Scaleは普通のスケール値として使うべきだと思いますので、Quad.Sの方をテクスチャサイズを入れます。

α値には親子関係が適用されない

 GameEngine2Dは、いわゆるシーンツリー方式を採用してますので、各スプライト間に親子関係が設定できます。子は親の座標やスケール値などを原点として描画しますので上手く使うととても便利なのですが、α値は親子関係を作ってくれません。つまり、「親と一緒に子もフェードアウトする」というような処理がそのままはできません。
 GameEngine2D.Sceneにぶら下げるNodeクラスはα値を持っておらず、その子クラスであるSpriteBase(Sprite系クラスの親クラス)にしかαが無いためです。
 そのため、αの親子関係は自前で処理する必要があります。