キーボード入力
この章ではキーボードの入力を検知する方法について解説します。
実行結果
SharpDXを関連付け
必要なパッケージをインストール
- 「NuGet」を使った同じやり方で「SharpDX.DirectInput」をインストールします。
DirectInputの設定
ファイルの読み込み処理
- 入力処理に必要なファイルを関連付けます。
using SharpDX.DirectInput;
- キーボード取得用変数を宣言します。
// キーボード取得用変数 private Keyboard _keyboard;
- キーボード取得用の初期化を行います。
// 入力周りの初期化 DirectInput dinput = new DirectInput(); if (dinput != null) { // キーボード入力周りの初期化 _keyboard = new Keyboard(dinput); if (_keyboard != null) { // バッファサイズを指定 _keyboard.Properties.BufferSize = 128; } }
キー入力処理
- キー入力用の処理を関数として作ります。
また、挙動確認用のサンプルに入力が合った場合はタイトルバーの文字が変わるようにしておきます。// キー入力処理 public void UpdateForKey() { // フォームにフォーカスが無い場合、処理終了 if (!Focused) { return; } // 初期化が出来ていない場合、処理終了 if (_keyboard == null) { return; } // キャプチャするデバイスを取得 _keyboard.Acquire(); _keyboard.Poll(); // デバイスからデータを取得する var state = _keyboard.GetBufferedData(); // 取得できない場合、処理終了 if (state == null) { return; } // 押されたキーデータを抽出 var isPressedKeys = state.Where(n => n.IsPressed); // 押されたキーデータが合った場合 foreach(var key in isPressedKeys) { // 挙動確認用:押されたキーをタイトルバーに表示する Text = "入力キー:" + isPressedKeys.First().Key.ToString(); // 例:キーごとに処理を行う switch (key.Key) { case Key.Escape: // Escキーが押されたらフォームが閉じるように処理 Close(); break; } } }
public void UpdateForKey()
をメインループ処理から呼び出します。
余談
利便性を上げる工夫
どのようなタイミングでも入力機器からの入力を受け付けるようにしておくことが大切です。
具体的には、
- ゲームアプリ起動後に差しても、入力を受け付けず、アプリ起動前に差している必要がある
- 複数のキーボードが差さっている場合、入力を受け付けないものがある
※大事なので「ゲームパッド入力」でも同じ話題に触れています。
今回のコードでは
- 複数差さっていても同じキー入力として処理
- ゲームアプリ起動前後どちらで差しても入力を受け付ける
私個人は、たまたま手元にあった「サンワサプライ ワイヤレススリムキーボード ブラック SKB-WL23BK」を使って、 上記コードの動作確認をしています。
(安価に購入したり・余った機器を有効活用するなど)ご自身の環境に合わせて是非お試しください。
コード
Program.cs
GameForm.cs