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

画像の管理について。前回文章で説明した内容をコードで書くとこんな感じ。

//インスタンスの生成を委譲するためのデリゲート
public delegate GmImageResource ImageResourceLoader(string assetName);

//画像リソース
public abstract class GmImageResource{
    //↓のデリゲートを使ってリソースを読み込む
    public static GmImageResource LoadResource(string assetName);

    //↓でGameなどからImageResource<Texture2D>.Loaderを設定する
    public static ImageResourceLoader Loader{get; set;}

    //実際に使用する型にキャストしたリソースを取得可能
    public abstract Tr Resource<Tr>() where Tr : class;

    //画像サイズやなんかも取得可能
    public int Width{get;set;}  //描画横サイズ
    public int Height{get;set;} //描画縦サイズ
    public int U{get;} //横描画基点位置
    public int V{get;} //縦描画基点位置
    //以下略。アニメーション制御用のメンバーがあります
}

//実際の画像リソースクラス(generics)
public class ImageResource<T> : GmImageResource where T : class {
    //T型の画像を読み込むためのデリゲート
    public delegate T LoadResouceDelegate(string resourceName);

    //画像読み込みの委譲先の設定と取得
    public static LoadResouceDelegate ResourceLoader { get; set; }
}

これをXNAで使うために、Game派生クラスのLoadContentあたりで

protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);
    GmImageResource.Loader = ImageResource<Texture2D>.GetResource;
    ImageResource<Texture2D>.ResourceLoader = this.Content.Load<Texture2D>;
}

こうすれば、あとはGmBullet.CreateInstanceなどで画像を取得するとき、これを使えばOK、と。

public class GmBullet : GmObject {
    protected GmImageResource image;
    public static GmBullet CreateInstance(string imageName){
        GmBullet newBullet = new GmBullet();
        newBullet.image = GmImageResource.Loader(imageName);
        OnCreated(newBullet, null);
        return newBullet;
    }
}     

んだば、実際にロードしようとするとどうなるかってーと・・・
GmImageResource.Loader() → ImageResource.GetResource() → ImageResource.ResourceLoader() → Game.Content.Load()
こうか。ちょっと回りくどすぎるかなぁ。