迷路を自動生成できるようになったので、次は操作をしましょう。
最近ちょっと文字量が多いと感じているので、分割して書きたいと思います。
キーボードで操作できるようにする
キーボードで動かす事ができるようにしたいと思います。
その為には、キーボードのどのボタン(キー)を押されたか知る必要があります。
そこで準備されているイベントは、下記3つです。
①KeyDown ②KeyPress ③KeyUp
KeyDown/KeyPress/KeyUpの違いについて
KeyDownとKeyPressは、ボタンが押された時、
KeyUpは、ボタンが離された時に発生します。
『あれ??KeyDownとKeyPressの違いってあるの??』って感じになりますよね?
それは、引数が違います。
KeyDownとKeyUpイベントハンドラでは、
KeyEventArgsオブジェクトにより、どのキーが押されたかを知ることができます。
KeyPressイベントハンドラは、
KeyPressEventArgsオブジェクトにより、どのキーが押されたか分かります。
説明が分かりずらいですね。。。
簡単に言うとKeyDownとKeyUpは、キーボードのボタン全てに対応しています。
逆にKeyPressは基本的には文字のボタンにしか対応していません。
KeyPressについてもう少し詳しく説明すると、
具体的には、Tabキー、Insertキー、Deleteキー、Homeキー、Endキー、PageUpキー、PageDownキー、ファンクションキー(F1~F12キー)、Altキー、Shiftキー、Ctrlキー、方向キーなどが押された時は発生しません。
Enterキー、BackSpaceキー、Escapeキーが押された時は発生します。
結局、対象キーをどれにするかが大事なんですね!!
今回はキーボードの矢印キーを使ってやりたいと思います。
KeyDownイベント まさかのイベント発生せず!!
適当なコントロールにKeyDownイベントを入れてみました。
private void Control_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
Console.WriteLine("↑が押されました。");
}
else if(e.KeyCode == Keys.Down)
{
Console.WriteLine("↓が押されました。");
}
else if (e.KeyCode == Keys.Left)
{
Console.WriteLine("←が押されました。");
}
else if (e.KeyCode == Keys.Right)
{
Console.WriteLine("→が押されました。");
}
}
あれ??動きません。。。
上手く反応しません。。。
矢印キーで操作をする場合は他の手段を使う必要がありそうです。
ProcessDialogKeyをオーバーライドする
ネームスペースのWindows.Form内に定義されているProcessDialogKeyをオーバーライドします。
このメソッドは、タブ、戻り値、ESC キー、方向キーなどのダイアログ文字を処理するために、メッセージのプリプロセス中に呼び出されます。
横文字ばかりでイヤになりますね。。。簡単に言うとProcessDialogKeyを書き換えます(上書き)。
protected override bool ProcessDialogKey(Keys keyData)
{
//左キーが押されているか調べる
if ((keyData & Keys.KeyCode) == Keys.Left)
{
return true;
}
//右キーが押されているか調べる
if ((keyData & Keys.KeyCode) == Keys.Right)
{
return true;
}
//上キーが押されているか調べる
if ((keyData & Keys.KeyCode) == Keys.Up)
{
return true;
}
//下キーが押されているか調べる
if ((keyData & Keys.KeyCode) == Keys.Down)
{
return true;
}
return base.ProcessDialogKey(keyData);
}
実際に動かしてみましょう。
無事に矢印キーでイベントが発生し、条件に入っている事が分かりました。
まとめ
キーボード操作でゲームを遊ぶにあたり、KeyDownイベントで対応しようと考えましたが、特殊キーはイベントが発生してくれませんでした。
その為、今回は【Windows.Form内に定義されているProcessDialogKeyをオーバーライド】する事で無事に対応する事ができました。
意外と知らない内容でびっくりしました。
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント