めざせお手軽で富豪的な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
こうか。ちょっと回りくどすぎるかなぁ。