【C#】迷路をつくろう 操作編 その1(キー操作)

スポンサーリンク

迷路を自動生成できるようになったので、次は操作をしましょう。

最近ちょっと文字量が多いと感じているので、分割して書きたいと思います。

キーボードで操作できるようにする

キーボードで動かす事ができるようにしたいと思います。

その為には、キーボードのどのボタン(キー)を押されたか知る必要があります。

そこで準備されているイベントは、下記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をオーバーライド】する事で無事に対応する事ができました。

意外と知らない内容でびっくりしました。

コメント

タイトルとURLをコピーしました