めざせお手軽で富豪的なSTGアーキテクチャー(6)

描画インターフェースについて。
前回出てきた描画用インターフェースIDrawer2Dですが、これは拡大回転透過などの各種転送機能をインターフェースとしてまとめたもので、XNAのSpliteBatch.Drawを呼ぶクラス(つまりXna.Framework.Game派生クラス)あたりで実装します。
SpliteBatchは画像情報としてTexture2Dを受け取りますが、XNAの型をモデル側で使いたくないので新たにGmImageResourceという画像型を定義します。これについての詳細は次回にまわします。
IDrawer2Dの各種操作に渡されるGmImageResourceはTexture2Dと同様に画像サイズの情報を持っているので、、描画時に最低限必要なそれ以外の情報は「位置」だけです。
XNAのSpliteBatchでは、位置の指定方法はオーバーロードによって異なりますが、何でもできる9引数のものは位置をVector2型で渡し、その位置は「回転軸の座標(スクリーン系)」です。

//Microsoft.Xna.Framework.Graphics.SpliteBatch
public void Draw(Texture2D texture,	//テクスチャ
    Vector2 position,           //表示位置
    Rectangle? sourceRectangle, //テクスチャの転送位置
    Color color,                //合成する色
    float rotation,             //回転角度
    Vector2 origin,             //画像の回転軸(テクスチャの中心を指定)
    float scale,                //倍率
    SpriteEffects effects,      //エフェクト(反転するか)
    float layerDepth);          //Z位置

sourceRectangle(あるいはテクスチャ全体)のoriginがpositionに合わされて、rotation分だけ回転して描画されます。
そこでGmObjectの中心点=画像の中心点(origin)とすれば、回転軸の座標(position)=GmObjectの中心点となるため、扱いが非常に簡単です。中心が画像の中心ではない円形のオブジェクトなんてものは存在しないので、この式は常に成り立ちます。
ということで、IDrawer2Dのメソッドは以下のように定義することにしました。sourceRectangle,origin,effectsはGmImageResourceが提供できるし、colorは透明度変更以外で使わないだろうからalpha情報と入れ替え、残ったメンバーだけを組み合わせると・・・

public interface IDrawer2D {
    //通常転送
    //pはimgの中心が来る点
    void Draw(GmImageResource img, PointF p, float z);
    //回転拡縮転送
    //imgの回転軸が中心以外になるケースは除外
    void Draw(GmImageResource img, PointF p, float rotate, float scale, float z);
    //半透明転送
    void Draw(GmImageResource img, PointF p, byte alpha, float z);
    //回転拡縮・半透明転送
    void Draw(GmImageResource img, PointF p, byte alpha, float rotate, float scale ,float z);
}