アットウィキロゴ
だから信頼性は皆無ですってww


XNAとは

  • マイクロソフトによって提供された、ゲーム開発のためのツールである。
  • C#で開発する。
  • 筆者はMicrosoft Visual C# 2005 Express Editionで開発中。
  • Windows用、Xbox360用にコンパイル可能。

インストール


プロジェクト作成

メニューバーから、ファイル→新規作成→プロジェクト
XNA Game Studio 2.0から、Windows Game(2.0)を選択
プロジェクト名を入力。
テンプレートの出来上がり。

public class Game1 : Microsoft.Xna.Framework.Game

以下の関数がテンプレートとして用意されます。

public Game1()

コンストラクタ。
ボクはデフォルトからいじってません。
       public Game1()
       {
           graphics = new GraphicsDeviceManager(this);
           Content.RootDirectory = "Content";
       }

protected override void Initialize()

初期化関数。
コンストラクタと Initialize() メソッドの違いは、あるらしいが今は関係なさそうなのでほおっておく。
このあたりの初期化処理内部でごちゃごちゃやってます。
       protected override void Initialize()
       {
           // TODO: Add your initialization logic here
           game = this;
           TaskListmng.CreateInstance();
           Mapmng.CreateInstance();
           
           base.Initialize();
       }

protected override void LoadContent()

音とか、画像とかを読み込みなさいと言っている。
ボクはフォントなど、ゲームで一貫して使うリソースの読み込みと、デバッグ用のコードを(デバッグ用主人公作成とか)足したものを使用している。
       protected override void LoadContent()
       {
           // Create a new SpriteBatch, which can be used to draw textures.
           sysfont = Content.Load<SpriteFont>("Arial");
           spriteBatch = new SpriteBatch(this.GraphicsDevice);
           
           // 見た目の200,200にHeroを作成
           CharactorFactory.Instance.CreateCharactor(
               new task.Hero(new Vector2(600, 200), 64, 64, new Vector2(0, 0), 100, SpriteEffects.None),
               new HeroState());
           // 見た目の200,200にtekiを作成
           CharactorFactory.Instance.CreateCharactor(
               new task.Enemy(new Vector2(600, 300), 64, 64, 10, 2, SpriteEffects.FlipVertically),
               new CharctorNoMoveStrategy());
           // FPSカウンタを作成
           TaskListmng.Instance.Add(
               TaskListmng.TaskType.Effect,
               new task.FpsCounter());
       }

protected override void UnloadContent()

破棄作業はXNAがやってくれるはずなので、何もしない。

protected override void Update(GameTime gameTime)

デフォルトのコードに、全タスクの実行コードを足しただけ。
       protected override void Update(GameTime gameTime)
       {
           // Allows the game to exit
           if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
               this.Exit();
           
           // TODO: Add your update logic here
           TaskListmng.Instance.Update(gameTime); // 全タスクの実行
           
           base.Update(gameTime);
       }

protected override void Draw(GameTime gameTime)

デフォルトのコードに、スプライトバッチ処理開始終了と全タスクの描画コードを足しただけ。
       protected override void Draw(GameTime gameTime)
       {
           graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
           
           // TODO: Add your drawing code here
           
           spriteBatch.Begin(); // スプライトバッチ処理開始
           TaskListmng.Instance.Draw(gameTime); // 全タスクの描画
           spriteBatch.End();   // スプライトバッチ終了
           
           base.Draw(gameTime);
       }

つまり、ほとんどの処理をほかのクラスで動かして、こっちはすっきりさせましょう作戦。


リソース管理

XNAのリソース管理は基本的にほったらかしで良い。
読み込みたいファイルをGame.LoadContent()で読み込み、ほおっておくことにする。
破棄はGame.UnloadContent()が勝手にやってくれる・・・とおもう。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=4188218&SiteID=7
したがって、Game.LoadContent()とGame.Initialize()を修正する。
LoadContent()は画像、サウンドの読み込みに専念し、キャラクターの生成はInitialize()で行う。
はじめからこうすればよかったとか言わない。何事も疑問と調査と挑戦が大事。


名前:
コメント:
最終更新:2009年01月14日 00:24