2010年08月01日

【プログラム】XNAでゲームを作る(5)

7月はゲリラ豪雨や、猛暑日一週間続くなど怒涛な毎日でしたね

さて、管理人はというとプログラムがはかどりません

リアルな仕事のプログラムが忙しく、休日にプログラムをする気がおきていません・・・


きづけばキーボード入力の話が完結していないまま放置してましたね

ログをみるとXNAについて検索してこられる方が意外といらっしゃいまして、
シーン管理や日本語表示などニーズはあることがわかりました。

とりあえずキーボード入力の話を終わらせ、コントローラーの入力にいきましょう

XNAゲームプログラミング

XNAゲームプログラミング

価格:3,654円(税込、送料別)


前回までに各キーの押下状態取得までとれるようになりました。

あとは管理したいキーの情報をまとめるクラスを作成し、
そのクラスへアクセスするマネージャクラスを作成するだけです。

完成目の前ですよ〜


まずは管理したいキー情報をまとめるクラスを作りましょう

public class KeyboardInput : I_KeyboardState
{
}

インターフェイスを実装しておきましょう

そして管理したいキーの列挙体を宣言します。

private enum KeyboardKeyIndex: byte
  {
   ARROW_UP = 0,
   ARROW_DOWN,
   ARROW_LEFT,
   ARROW_RIGHT,
   ENTER,
   SPACE,

   KEYBOARD_KEY_MAX
  }

今回は十字キーとエンター、スペースとなっています。

この内容は「 I_KeyboardState 」のインターフェイス宣言部分とあわせてください

変数は以下の2つを定義します

private KeyboardState m_kbPrev, m_kbCurr;
private KeyboardInputState[] m_kbButtons;

m_kbPrevは1フレーム前のキー入力状態の情報です
m_kbCurrは今のフレームのキー入力状態の情報となります。
m_kbButtonsは前回作成したクラスのテーブルになります。
このテーブル内に管理したいキー情報がすべて入ります。

プロパティとして以下の情報を登録します

public KeyboardState Previous { get { return this.m_kbPrev; } }
public KeyboardState Current { get { return this.m_kbCurr; } }
public I_KeyboardButtonState ARROW_UP  {get{return(m_kbButtons[(int)KeyboardKeyIndex.ARROW_UP]);}}
public I_KeyboardButtonState ARROW_DOWN { get { return (m_kbButtons[(int)KeyboardKeyIndex.ARROW_DOWN]); } }
public I_KeyboardButtonState ARROW_LEFT { get { return (m_kbButtons[(int)KeyboardKeyIndex.ARROW_LEFT]); } }
public I_KeyboardButtonState ARROW_RIGHT { get { return (m_kbButtons[(int)KeyboardKeyIndex.ARROW_RIGHT]); } }
public I_KeyboardButtonState ENTER{ get { return (m_kbButtons[(int)KeyboardKeyIndex.ENTER]); } }
public I_KeyboardButtonState SPACE { get { return (m_kbButtons[(int)KeyboardKeyIndex.SPACE]); } }

たくさんありますが、最初の2つはキー入力状態を取得する部分で、
残りは管理したいキー情報を取得する部分になります。

あとはこのクラスの実装部分であるコンストラクタを作りましょう

public KeyboardInput()
  {
   m_kbButtons = new KeyboardInputState[(int)KeyboardKeyIndex.KEYBOARD_KEY_MAX];
   for (byte i = 0; i < m_kbButtons.Length; i++)
   {
    m_kbButtons[i] = new KeyboardInputState(30, 10);
   }

   this.Update();
  }

まず管理したいキー情報のテーブルを実装します。
列挙体数分として使えるように、列挙体の最後に「 KEYBOARD_KEY_MAX 」を宣言しておくと楽ですよ

そして作成したテーブルの中のデータ一つ一つを完全に実装していきます。
コンストラクタの引数として入力して30フレーム後から10フレーム毎にリピート状態になると宣言しています。

そして各情報を初期化するため、更新関数を呼び出しています。
その更新関数は以下の内容で作成しましょう

public void Update()
  {
   // 直前フレームのコントローラ情報を格納
   m_kbPrev = m_kbCurr;
   // 現フレームのコントローラ情報を取得
   m_kbCurr = Keyboard.GetState();

   // 各ボタン押下状態
   m_kbButtons[(int)KeyboardKeyIndex.ARROW_UP].Update(m_kbCurr.IsKeyDown(Keys.Up));
   m_kbButtons[(int)KeyboardKeyIndex.ARROW_DOWN].Update(m_kbCurr.IsKeyDown(Keys.Down));
   m_kbButtons[(int)KeyboardKeyIndex.ARROW_LEFT].Update(m_kbCurr.IsKeyDown(Keys.Left));
   m_kbButtons[(int)KeyboardKeyIndex.ARROW_RIGHT].Update(m_kbCurr.IsKeyDown(Keys.Right));
   m_kbButtons[(int)KeyboardKeyIndex.ENTER].Update(m_kbCurr.IsKeyDown(Keys.Enter));
   m_kbButtons[(int)KeyboardKeyIndex.SPACE].Update(m_kbCurr.IsKeyDown(Keys.Space));
  }

2行目で今のフレームの入力状態を取得しています。
そして取得した情報からテーブルへ各キーの状態をセットしています。


これでこのクラスは終了です。

最後にこれらを管理するマネージャクラスを作成します。

public sealed class KeyboardPropaerty
{
}

変数は先ほどのクラスを宣言します。

private KeyboardInput m_KeyboardInput;

そしてプロパティはこの変数を取得できるようにします。
public KeyboardInput GetKeyboardInput{get{return this.m_KeyboardInput;}}

コンストラクタは、このクラスを実装します

public KeyboardPropaerty()
 {
  m_KeyboardInput = new KeyboardInput();
 }

更新関数は、このクラスの更新関数を呼ぶだけです
public void Update()
 {
  m_KeyboardInput.Update();
 }

これでキーボードの入力管理クラスの作成が終了しました。

では実際に使ってみましょう。


Mainループしているメンバ変数に、キーボード入力管理マネージャークラスを宣言し、
実装してください。


// 入力
privave KeyboardPropaerty m_KeyInput;

// コンストラクタやコンテントロードの部分で実装しておく
m_KeyInput = new KeyboardPropaerty();

メインループの最初に更新処理を行います

// キーボード入力更新
m_KeyInput.Update();

あとはプロパティから調べたいキーを指定し判断します。

// Enterキーの状態がJustPress状態であるか判断する
if( m_KeyInput.GetKeyboardInput().ENTER.JustPressed == TRUE)
{

}

m_KeyInput.GetKeyboardInput() ここで管理マネージャから「 KeyboardInput 」クラスの情報を取得しており

そのクラス内のプロパティである「 ENTER 」を呼び出す

その中にあるプロパティ「 JustPressed 」を呼び出しBool判断をする

という使い方になります。


いかがだったでしょうか

今まで作成したソースをKeyboardPropaerty.csから落とせます。
興味を持ったらぜひ活用してみてください。

それでは、この辺で
お疲れ様でした。

posted by ヒイロ at 23:00| 福岡 ☀| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。