素人がゲームプログラム作成に挑戦
ゲームを買うお金がないから、ゲームを作るというゲームに挑戦!言語はVisual Basic(VB)をメインにC++、C#、Javaは参考程度
Entries
複数キー入力の同時押し判定 その1
- ジャンル : コンピュータ
- スレッドテーマ : Visual Basic
ゲームではない限りなかなか利用しない複数キーの同時押し判定についてまとめておきます。
ここで言う複数キーとはShiftキーやAltキー、Ctrlキーなどのキーを使ったものではなく、
矢印キーやスペースキー、文字キーを指します。
AltとかShiftとかはゲームで使うことがあまりないでしょうから。
キー入力を判定するために利用するイベントメソッドにはKeyDownがあります。
このイベントは1つのキーを押している間に新たなキーを押すと、
前に押されていたキー情報を忘れるという特徴?を持っています。
この特徴があるおかげでKeyDownだけでは複数キーの同時押し判定ができません。
よって、このイベントでできるのは、押されたキー情報を1つだけ判定するということだけです。
同時押しと言っても本当の同時押しってのは現実的に難しいわけで、
複数のキーが押された時間はミリ秒単位でずれているもんです。
だから最初に押されたキー情報は一瞬で忘れ去られてしまうわけですね。
しかし、複数キーを押した情報としては1つしか残っていませんが、
複数のキーを押している事実は変わりません。
この事実を利用してしまえばいいわけです。
キーを押しているということは、いつかキーを離すわけです。
この離した瞬間に離されたキーを特定すればどのキーが今まで押されていたかがわかります。
キーを離した瞬間に発生するイベントはKeyUpになります。
これを使って離されたキーを特定します。
以上のことを踏まえ、複数キーの同時押しを特定するアルゴリズムを考えていきます。
手っ取り早い複数キーとしてカーソル(矢印)キーとスペースキーで考えます。
シューティングゲームなどを作るとしたら、上下左右だけでなく、左上・左下・右上・右下という移動もできなければなりません。
さらに、移動しながら弾を撃つということもします。
これらの操作は同時に行うことがあり、その瞬間は同時押し状態になっていると言えます。
先ほども述べたように、KeyDownイベントでは最後に押されたキー情報しか判定できません。
よって、それまでに押したキー情報を別途保存しておく必要があります。
この保存をどうするかがポイントになります。
押されるキーは上下左右の4つとスペースキー1つの5種類です。
それらの情報を保存するような変数が必要になります。
配列にするか、Listにするか、はたまたまったく違うものにするか・・・。
やりたいのはKeyDownイベントが発生したときに、押されたキー情報を記録し、
KeyUpイベントが発生したときに、押していたというキー情報を削除するということです。
ということは、それぞれのキーに対して押されたか押されていないかの2択しかないわけです。
となると、Boolean型の変数を用意すればいけるかも・・・。
で、いろいろ考えると、ビットフィールドを使ったほうが簡単という結論にいたりました。
ビットフィールドなら1つの変数で上下左右・スペースの5種類を5ビットで管理できますし。
押された・離されたという処理も論理演算子でやれますし。
と、長くなったのでとりあえず今回はここまで。
続きはまた次回に。
ここで言う複数キーとはShiftキーやAltキー、Ctrlキーなどのキーを使ったものではなく、
矢印キーやスペースキー、文字キーを指します。
AltとかShiftとかはゲームで使うことがあまりないでしょうから。
キー入力を判定するために利用するイベントメソッドにはKeyDownがあります。
このイベントは1つのキーを押している間に新たなキーを押すと、
前に押されていたキー情報を忘れるという特徴?を持っています。
この特徴があるおかげでKeyDownだけでは複数キーの同時押し判定ができません。
よって、このイベントでできるのは、押されたキー情報を1つだけ判定するということだけです。
同時押しと言っても本当の同時押しってのは現実的に難しいわけで、
複数のキーが押された時間はミリ秒単位でずれているもんです。
だから最初に押されたキー情報は一瞬で忘れ去られてしまうわけですね。
しかし、複数キーを押した情報としては1つしか残っていませんが、
複数のキーを押している事実は変わりません。
この事実を利用してしまえばいいわけです。
キーを押しているということは、いつかキーを離すわけです。
この離した瞬間に離されたキーを特定すればどのキーが今まで押されていたかがわかります。
キーを離した瞬間に発生するイベントはKeyUpになります。
これを使って離されたキーを特定します。
以上のことを踏まえ、複数キーの同時押しを特定するアルゴリズムを考えていきます。
手っ取り早い複数キーとしてカーソル(矢印)キーとスペースキーで考えます。
シューティングゲームなどを作るとしたら、上下左右だけでなく、左上・左下・右上・右下という移動もできなければなりません。
さらに、移動しながら弾を撃つということもします。
これらの操作は同時に行うことがあり、その瞬間は同時押し状態になっていると言えます。
先ほども述べたように、KeyDownイベントでは最後に押されたキー情報しか判定できません。
よって、それまでに押したキー情報を別途保存しておく必要があります。
この保存をどうするかがポイントになります。
押されるキーは上下左右の4つとスペースキー1つの5種類です。
それらの情報を保存するような変数が必要になります。
配列にするか、Listにするか、はたまたまったく違うものにするか・・・。
やりたいのはKeyDownイベントが発生したときに、押されたキー情報を記録し、
KeyUpイベントが発生したときに、押していたというキー情報を削除するということです。
ということは、それぞれのキーに対して押されたか押されていないかの2択しかないわけです。
となると、Boolean型の変数を用意すればいけるかも・・・。
で、いろいろ考えると、ビットフィールドを使ったほうが簡単という結論にいたりました。
ビットフィールドなら1つの変数で上下左右・スペースの5種類を5ビットで管理できますし。
押された・離されたという処理も論理演算子でやれますし。
と、長くなったのでとりあえず今回はここまで。
続きはまた次回に。
0件のコメント
コメントの投稿
0件のトラックバック
- トラックバックURL
- http://hinagis.blog33.fc2.com/tb.php/41-f17d603e
- この記事に対してトラックバックを送信する(FC2ブログユーザー)



