初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

Small Basic 入門

32.ゲーム用のキー入力プログラムを考える

 

アクションゲームのキャラをキーで操作するプログラムは、少し複雑です。
どのような方法で作成するのか紹介したいと思います。

サンプルプログラムは、できるだけシンプルにしました。
ここまで読んだ方であれば理解できるでしょう。

サンプルプログラムは実行してみましょう
説明の意味がより理解し易くなります。

 

 

GraphicsWindow.LastKey

グラフィックス( GraphicsWindow )でゲームを作るとき、キー情報は
GraphicsWindow.LastKey を使います。

次のプログラムを見てください。

 

キー情報の取得のしかた

 

基本的な使い方です。
今までのゲームの中でも使っています。
任意の変数(今回は inkey)に代入する形で使います。(7行目)

この方法で最後に押されたキーが分かります。
押されたキーがどのような文字で取得できるのか知りたいときには次を見てください。

[ GraphicsWindow.LastKey で取得できる値 ]

 

実行して動きを確認しましょう。
8 行目と 11 行目で左右のキーが押されたかチェックしています。
左右のカーソルキーで画面に表示した四角が動かせます。

 

左右キーのチェック

 

1回押したら動き続ける理由は、最後に押されたキーを保持したままになるからです。
(7行目では毎回、最後に押されたキーが inkey に代入される)

このキー入力の方法に合うゲームならばいいのですが
このままでは使えないゲームがほとんどだと思います。

 

 

キーを押したときだけ動かす

キーを押しているときだけキャラを動かしたい
という場合、どうすればいいのでしょうか。

次のサンプルを実行してみましょう。

 

キーを押しているときだけ動かすプログラム

 

キーを押しているときだけ動くようになりました。
押した瞬間、押されたキーを取得し(22行目)
キーを離した瞬間、キーが押されていないという情報に書き換える(26行目)
という仕組みです。

GraphicsWindow.KeyDown はキーが押されたときに呼び出すサブルーチンを
登録します。
登録の方法は 5 行目のように、呼び出したいサブルーチン名を代入します。
これだけで、キーが押されたとき OnKeyDown が実行されるのです。

GraphicsWindow.KeyUp はキーを離したときに呼び出すサブルーチンを
登録します。

この2つを使うことで、押している間を調べます。
While から EndWhile (8 行目から 19 行目まで)の間はつねに処理されます。
キーが押されたときだけ OnKeyDown が実行され、
キーが離されたときだけ OnKeyUp が実行されます。
つまり、キーが押されているときだけ inkey の中に有効なキー情報が入るのです。

 

 

間違ったキー入力プログラム

ときどき間違ったキー入力プログラムを作っている人がいるので、その例を1つ。

次のサンプルを実行してみましょう。

 

ダメな入力プログラム

 

少し反応がにぶいですが、キーを押している間だけ動きます。
GraphicsWindow.KeyUp も使わず、プログラムの行数が少ないですね。
反応がにぶいだけなので、これでも良しとしてしまう人がいます。

しかし、アクションゲームやシューティングゲームでは、この反応のにぶさは
マイナス要素です。プレイヤーをイラつかせることにもなります。
注意しましょう。

 

ちなみに押している間だけ動いているように見える理由はキーリピートです。
パソコンのキーを押しっぱなしにすると、連続でキーが入力される機能のことです。
反応がにぶい理由は、キーリピートが発生するまで少し間があるからです。

 

 

3つ目のキー入力について

ゲームならばプレイヤーキャラを動かすだけでなく、ジャンプしたりビームを
撃ったりします。
このような場合、さきほど説明したプログラムでは対応できません。

例として、左右のキーで四角を移動させ、スペースキーでジャンプするプログラムに
変更してみました。
実行して試してみましょう。
(このプログラムは説明用の簡易版です。実際には仕様に合わせた制限が必要です)

 

複数のキーを操作する例

 

スペースキーを押すと四角がジャンプしますが、左右への移動が止まってしまいます。
シューティングゲームならば、移動しながらビームを撃ちたいですよね。
これでは使えません。

 

移動しながらもジャンプが出来る(ジャンプ後、移動が止まらない)プログラムに
変更します。

 

移動しながらジャンプできるプログラム

 

変数 holdkey に左右キーのみの情報を保持するようにしました。(28 行目)
そして、離したキーも取得するようにして(33 行目)
holdkey 内にある内容と同じであれば、クリアします。(34,35 行目)

簡単に言ってしまえば、holdkey を使って左右キーの情報とジャンプの情報を
切り離した訳です。

 

以上で説明を終わりますが、これがベストという訳ではないです。
ゲームの内容に合ったものを自分なりに考えてみてください。
ちなみに、マウスで移動、クリックでジャンプならば
もっと簡単にプログラムできます。
まずは、マウス操作でゲームができるか考えてからでも良いと思います。