2011年07月31日

C#とDXライブラリでゲーム制作 7回目

キーボード押下状態の取得

DXライブラリでキーボード押下状態を取得するためには、GetHitKeyStateAllを使います。(CheckHitKeyを使うこともできますが、“CheckHitKey 関数はとても無駄の多い関数”なので、GetHitKeyStateAllを使うようにします)

基本的には下記のように使います。

// キーボード押下状態を保存するバッファの宣言
Byte[] keyStateBuf = new byte[256];

// キーボード押下状態の読み込み
DX.GetHitKeyStateAll(out keyStateBuf[0]);

// 押下状態の判定(例:リターンキーが押されたか?)
if ( keyStateBuf[ DX.KEY_INPUT_RETURN ] == 1 )
{
    // リターンキーが押された
}

しかし、この方法ではリターンキーを押しっぱなしにすると、常に「リターンキーが押された」と判定してしまいます。場面によってはリターンキーが押された瞬間だけ処理をしたいこともありますね。例えばテトリスのような落ちモノパズルを考えてみてください。左右の移動や落下についてはカーソルキーが押されている間動き続けても良いでしょうが、回転についてはボタンを押した瞬間だけ処理をするようにしないと、ボタンを押し続けている間、回転し続けることになります。これではゲームになりません。

対処方法として、キーボード押下状態を保存するバッファを2つ持ち、順番に切り替えて状態を取得します。そして、「直前は放されていた」「今回は押されている」の条件を満たしたときだけ「キーが入力された」と判断します。

// キーボード押下状態を保存するバッファ
byte[,] keyStateBuf = new byte[2, 256];

// バッファのフレーム(どちら側が有効か)
int keyStateBufNo = 0;

〜キーボード押下状態を読み込むとき〜

// フレームを切り替える
keyStateBufNo ^= 1;

// 今のフレームにキーボード押下状態を読み込む
DX.GetHitKeyStateAll(out keyStateBuf[keyStateBufNo, 0]);

〜キーボード押下状態の判定のとき〜

// 今のフレーム:押されている AND 前のフレーム:放されている のとき true
if ( (keyStateBuf[ KeyStateBufNo, DX.KEY_INPUT_RETURN ] == 1) &&
    (keyStateBuf[ KeyStateBufNo ^ 1, DX.KEY_INPUT_RETURN ] == 0))
{
    // 入力されたと判断
}

キーボードの入力処理は毎フレーム実行する必要がありますし、キーボード押下状態の判定は演算処理で度々使うことになるため、クラス化しておくことにします。

InputController.cs

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 20:00 | Comment(0) | TrackBack(0) | ゲーム制作
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/46904005

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