キーボードからの入力取得


●GetKeyStateによる直接入力

キーボードからの入力取得は、他のDELPHI入門の本などでは
キーが押された時のOnKeyDown
文字入力そのものに反応するOnKeyPress
キーが離された時のOnKeyUp
があるが、これはゲームで使うにはあまり具合が良くない。

なぜならキーを押して1回目はすぐ受け付けるが
2回目以降の反応に間が開いてしまうから。
「P・・・PPPPPPPPP」という感じになってしまい
押しっぱなしにならないので、アクションゲームには不向きである。

こうならないようにするには、GetKeyStateという
ウインドウズから直接キー入力を見る命令を使用する。
private
{ Private 宣言 }
x :Integer; //この行を追加。X軸の移動検知

procedure TForm1.FormCreate(Sender: TObject);
begin
x :=0; //Xの初期化
Timer1.Enabled := True; //タイマーイベントを有効にする。
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (GetKeyState(VK_RIGHT) < 0) then x :=x+1; //右を押して増加
if (GetKeyState(VK_LEFT) < 0) then x := x-1; //左を押して減少
Caption:=IntToStr(x); //X軸の値を文字列にして上のバーに表示
end;

//コンポーネントのTimerを、FORMに貼り付け
インスペクタのIntervalを20にしておく。
これを実行すると、最初の途切れが無しに
上のバーに出ている数値を
キーボードの右で増加。左で減少できる。
ボタンの入力を見たい場合はこうなる。
if (GetKeyState(Ord('Z')) < 0) then x :=x+1;
Ord('Z')とやればZキーが反応。AならAが反応。
文字でなく、キーそのものを見ているので
大文字小文字の区別無く受け付ける。

●よく使うキー

VK_UP
VK_DOWN
VK_RIGHT
VK_LEFT
スペース VK_SPACE
リターン VK_RETURN
エスケープ VK_ESCAPE
シフト VK_SHIFT
テンキー数字0 VK_NUMPAD0
Zキー Ord('Z')
他について知りたければ自己調査で。

●参考までに

OnKeyDownのやりかたを説明。上のプログラムに続いて

FORMのインスペクタのプロパティ、KeyPreviewをFalseからTrueにし
FORMのインスペクタのイベント、OnKeyDownをダブルクリック。
出てきた行に以下を追加。
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_UP) then x :=x+1; //この行を追加
end;
変数Keyでキー入力を判断。
ちなみに、Aキーの場合は(Key = Word('A'))とワード形式に。

キーボードの上キーで数字が上昇する。最初に一度上昇が止まるのが確認できる。

ゲーム内ではあまり使えない。が、タイトルのセレクトやコンフィグなど
カーソル選択が必要な時は逆にこちらのほうが使いやすいかもしれない。

 戻る