『目玉ゲームエンジン』で楽々ゲーム開発 第0回

 今日は目玉Pが泊まりにきてるので、いろいろ教わりながらXNAのプログラム作ってます。
 XNAというのは、MicrosoftがXBO360用に提供している開発環境なのですが、ドライバーをインストールすればWindows上でも動くゲームを開発できます。
 開発言語は、C#で、VisualStudio2008で開発します。
VisualStudio2008は無償版のExpressEditionでOK。XNAライブラリのXNA Game Studio 3.0も無償で提供されるため、Windowsさえあれば追加費用無しで開発環境を整えることが出来ます。


X NAを直接使っても開発は出来ますが、より効率的に開発を行うために目玉Pさんがフレームワークライブラリを開発しています。
「目玉ゲームエンジン」(仮称)です。


 先日は、このエンジンを使って簡単なゲームを作ってみました。
 スプライトやサウンドを使ったゲームが簡単に作れました。
ゆっくりトリップ
スクリーンショット



 その後エンジンもいろいろ改良され、VisualStudioのテンプレート機能も利用できるようになりました。
 ゲームで使用するシーンやキャラクターを追加する際に必要となるクラスのスケルトンを自動的に作成してくれる機能です。
 これは大変便利で、開発効率がかなりアップしました。
今日は、このテンプレートを使った開発方法のメモを作成しましたので、参考資料として公開します。
 ゲームエンジン自体の公開は、もう少し仕様をブラッシュアップしてからとなりますが、だいたいの雰囲気を感じていただければ幸いです。




                                                                                                • -

『目玉ゲームエンジン』を使った開発手順メモ

                                                                                                • -


■ キャラクターを画面に表示するまでの流れ


● テンプレートファイルを入れるフォルダ


以下の様に配置

・プロジェクト
My Documents\Visual Studio 2008\Templates\ProjectTemplates\Visual C#\MeraXNALib2GameTemplate.zip
・State
My Documents\Visual Studio 2008\Templates\ItemTemplates\Visual C#\MeraXNALib2_StateClass.zip
・Define
My Documents\Visual Studio 2008\Templates\ItemTemplates\Visual C#\MeraXNALib2_GameDefineClass.zip
・Object
My Documents\Visual Studio 2008\Templates\ItemTemplates\Visual C#\MeraXNALib2_GameObjectClass.zip



● プロジェクト作成


ファイル→新規作成→プロジェクト

・マイテンプレートから「MeraXNALib2GameTemplate」を選択
・プロジェクト名を入力してOK(例:「SahraTan」)


プロジェクトは以下のフォルダに作成される
My Documents\Visual Studio 2008\Projects\SahraTan\



● 最初の画面が出るまでの流れ


▼ イメージファイル

 使用するイメージファイルをプロジェクトに登録しよう


 プロジェクトフォルダの下にDatas\Textures フォルダを作る

My Documents\Visual Studio 2008\Projects\SahraTan\Datas\Textures


 ここに、使用するイメージファイルをコピー
 例:sahra1_180x180.jpg



▼ Contentにイメージファイルを追加

 ソリューションエクスプローラから・・・
 ・Content→Characterフォルダを右クリック
 ・追加→既存の項目
 ・ファイルオープンダイアログが開くので、イメージファイルを選択
  例:My Documents\Visual Studio 2008\Projects\SahraTan\Datas\Textures\sahra1_180x180.jpg
 ・「追加▼」ボタンを押すとメニューがでるので、「リンクとして追加」を選ぶ
 ※これでContentのイメージファイルが登録された
 ※「リンクとして追加」を選択することで、最初に作ったイメージファイルのフォルダ(Datas\Textures )の内容を更新することで、Contentにも更新されるようになる



▼ 舞台を用意しよう1(Stateの作成・登録)

 Stateは、タイトル画面、ゲーム中画面、ゲームオーバー画面などのシーンごとに作るとよいです。


 ▽ まずは、Sahraを表示するStateを作成する

 ソリューションエクスプローラから・・・
 ・Statesフォルダで→クリック
 ・追加→新しい項目
 ・マイテンプレートから「MeraXNALib2_StateClass」を選択
 ・ファイル名を入力(例:「State_Sahra.cs」)


 ▽ ファイルを一部修正
 ・「State_Sahra.cs」を開き、Using句部分を修正
 ・以下のようになっている行の「States.」を削除する

  using SahraTan.States.Game;
  using SahraTan.States.Messages;
  using SahraTan.States.Objects;
  using SahraTan.States.States;

 ▽ StateInstance.csに登録
 ・以下の行を追加
  public interface <インターフェース名> : IGameState { }
  例:

public interface IState_Sahra : IGameState { }

 ▽ GameMain.csにインスタンス追加
 ・「ステート情報」リージョン内に以下の行を追加
  public <インターフェース名> <インターフェース変数名>;
  例:

public IState_Sahra itState_Sahra;

 ・「各種ステート登録。」に以下の行を追加
  this.<インターフェース変数名> = new <インターフェース名>(this);
  例:

  this.itState_Sahra = new State_Sahra(this);


▼ 舞台を用意しよう2(定数定義)


 ▽ 定義用クラスを作成する(Define)
 ソリューションエクスプローラから・・・
 ・Gameフォルダで右クリック
 ・追加→新しい項目
 ・マイテンプレートから「MeraXNALib2_GameDefineClass」を選択
 ・ファイル名を入力(例:「Sahra.cs」)
  ※定数名に含まれるので短い名前にしたほうが吉



▼ キャラクターを登録


 ▽ 定義用クラス(Define)にキャラクターの定数を登録
 ソリューションエクスプローラから・・・
 ・Game→定義用クラスを開く(例:「Sahra.cs」)


 ・定数追加
  以下のenumに定数を追加
public enum MF_<定義名>_Texture
public enum MF_<定義名>_Motion
public enum MF_<定義名>_Logic


  例:

public enum MF_Sahra_Texture
{
非表示 = (int)MF_Texture.MAX,
サアラ,
MAX
}


▼ ロジックを作成(キャラクターの動きなどのプログラムを記述するクラス)


 ▽ ロジッククラスを作成する
 ソリューションエクスプローラから・・・
 ・Objects→Characterフォルダで右クリック
 ・追加→新しい項目
 ・マイテンプレートから「MeraXNALib2_GameObjectClass」を選択
 ・ファイル名を入力(例:「Sahra.cs」)
 ※これで何もしないロジックが生成される
 ※ロジックは「Logic(WorkArea oWorkArea, int iId)」メソッド内に記述する(あとで)




▼ Stateにキャラクターを登録しよう (2Dモデルの場合)


 ・最初につくったStateを開く(例:States→State_Sahra.cs)


 ・以下の行を追加


 ▽ テクスチャ定義(イメージ)
 this.oWorkArea.DefineTexture( <テクスチャ名>, @"<テクスチャパス>");
 例:

this.oWorkArea.DefineTexture( (int)MF_Sahra_Texture.サアラ, @"Character\sahra1_180x180");

  ※イメージファイル名の拡張子はいらないよ


 ▽ アニメ定義
  this.oWorkArea.DefineAnime(
   <モーションID>,<テクスチャID>, <枚数>,<テクスチャ横サイズ>,<テクスチャ縦サイズ>, 0, 0,
   new MeraAnimeFrame[] {
   new MeraAnimeFrame(0,0,0,65535) // アニメパターン<枚数>の分だけ記述
   },
   MeraAnimeMode.自動
  );
  例:

this.oWorkArea.DefineAnime(
(int)MF_Sahra_Motion.サアラ, (int)MF_Sahra_Texture.サアラ, 1, 180, 180, 0, 0,
new MeraAnimeFrame[] {
new MeraAnimeFrame(0,0,0,65535),
},
MeraAnimeMode.自動
);

 ▽ ロジック登録
 this.oWorkArea.DefineLogic(<ロジックID>, new ロジッククラス());
 例:

 this.oWorkArea.DefineLogic( (int)MF_Sahra_Logic.サアラ, new Objects.Character.Sahra() );

 以上。ここで、定義したキャラクターをもとに複数オブジェクトを生成できる




▼ オブジェクト生成


 ・最初につくったStateを開く(例:States→State_Sahra.cs)
 ・以下の行を追加


 ▽ オブジェクト生成

this.oWorkArea.CreateObject(
<ロジックID>, (int)MF_Group.無効, MeraObjType.Sprite3D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0f,
<パラメータ0>, MeraDistance.右, <モーションID>, SpriteBlendMode.AlphaBlend,
TextureFilter.PyramidalQuad, TextureFilter.PyramidalQuad, TextureFilter.PyramidalQuad,
TextureAddressMode.Wrap, TextureAddressMode.Wrap, 0,
new int {0,0,0,0,0,0,0,0}, new float {0,0,0,0,0,0,0,0}, -1);
  例:

this.oWorkArea.CreateObject(
(int)MF_Sahra_Logic.サアラ, (int)MF_Group.無効, MeraObjType.Sprite3D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.0f,
(int)Objects.Character.MF_Sahra_State.初期値, MeraDistance.右, (int)MF_Sahra_Motion.サアラ, SpriteBlendMode.AlphaBlend,
TextureFilter.PyramidalQuad, TextureFilter.PyramidalQuad, TextureFilter.PyramidalQuad,
TextureAddressMode.Wrap, TextureAddressMode.Wrap, 0,
new int { 0, 0, 0, 0, 0, 0, 0, 0 }, new float { 0, 0, 0, 0, 0, 0, 0, 0 }, -1);
  

▼ 作成したStateを呼び出す

 ・GameMain.csを編集
 ・以下の書き換え
// 初期ステート開始。
this.oController.ChangeState(<ステート名>.Value);


  例:

this.oController.ChangeState(itState_Sahra.Value);


 以上。これで登録したキャラクターが画面に表示されます。


【上記で手順で開発したプログラムのスクリーンショット










■ 音を出そう

XACTと使用してサウンドを登録し、プロジェクトに追加、再生までの流れ



▼ プロジェクト用フォルダ作成


・ファイル置き場を作成
 ロジェクトフォルダの下にSounds フォルダを作る
 「My Documents\Visual Studio 2008\Projects\SahraTan\Sounds」


・WAVファイルをコピー
 Soundsフォルダ下に waves フォルダを作成
 例:

 My Documents\Visual Studio 2008\Projects\SahraTan\Sounds\waves

 このフォルダに使用するWavファイルをコピーする



▼ XACTでの操作(プロジェクト作成、WAV登録)

・「XACT Auditioning Utility」を起動
・「Microsoft Cross-Platform Audio Creation Tool (XACT)」を起動


・XACTで新規プロジェクト作成
 先ほど作成した、Soundsフォルダに作成。
 プロジェクト名は、本体の名称とあわせる(例:SahraTan.xap)


・WaveBank作成
 Wave banks→New Wave Bank


・SoundBank作成
 Sound banks→New Sound Bank



・WAVファイルの登録
 WAVファイルをXACTのWAVE BANKにドロップする


ADPCM形式にして容量を減らす(任意)
 XACTの左のツリーの「Compression Presents」を右クリックして「New Compression Preset」を選択。
 「Compression Preset」が作成される。
 ここに、WAV BANKからWAVファイルをドロップするとそのWAVファイルは、指定の圧縮率になる。
 (デフォルトでは、ADPCM 128 Samples Per Block)


・Cueに登録
 WaveBankのWavファイルをSoundBankの下側の枠にドロップ
 ここに登録された「Cue Name」をつかってプログラムからアクセスする(Cue Nameは変更可能)




▼ プログラム変更


サウンドコントローラ初期化。
 GameMain.csの「サウンドコントローラ初期化。」に以下のように記述


this.oSound = new SoundManager(this, "プロジェクト名", "プロジェクト名", @"Content\Sound\");
this.Components.Add(this.oSound);


例:

  this.oSound = new SoundManager(this, "SahraTan", "SahraTan", @"Content\Sound\");
  this.Components.Add(this.oSound);


・BGMとして再生する場合
 StateクラスのReset()メソッド以下のように記述(例:State_Sahra.cs)
 例:

  oGame.oSound.StopPlayList();
  oGame.oSound.RepeatPlayList = true;
  oGame.oSound.StartPlayList(new string[] { "BGM001" });
  oGame.oSound.Play("BGM001"); 

 ※「BGM001」は、XACTに登録してCue Name




・効果音として再生する場合
 ロジッククラスに記述する場合の例(例:Objects.Character.Sahra.cs)
 Logic()メソッドに以下のように記述


 例:

  if (oWorkArea.oInput.WasPressed(0, InputHandler.ButtonType.B, Keys.Z))
  {
   ((GameMain)oWorkArea.oGame).oSound.Play("attack");
  }

 ※ トリガーBが押された場合、「attack」としてCueに登録されたサウンドを再生



以上です。
ね、簡単でしょ?