素人がゲームプログラム作成に挑戦
ゲームを買うお金がないから、ゲームを作るというゲームに挑戦!言語はVisual Basic(VB)をメインにC++、C#、Javaは参考程度
Entries
複数キー入力の同時押し判定 その2
- ジャンル : コンピュータ
- スレッドテーマ : Visual Basic
複数キー入力の同時押し判定 その1の続きです。
キーが押されたかどうかの情報はビットフィールドで管理することを考えましたので、
それを定義しておきます。
ビットフィールドは列挙型で、値が2のn乗になっているだけですね。
後はその列挙型のデータを用いて5つのキー情報を管理する変数も用意しておきます。
これらの定義はKeyDownイベントとKeyUpイベントで利用しますから、フィールドとして定義しておきます。
上記の定義により、変数kyには00000から11111の状態が管理されます。
ビットが立っているところが押されているキー情報となります。
このビットフィールドを用いて複数キーの同時押しを判定していきます。
まず、KeyDownイベントが発生したときに、押されたキーを取得し、ビットを立てます。
ビットを立てるのは論理和(OR演算子)を利用することで行います。
論理和は2つの値のビットの和を求める方法です。
例えば、100と010の論理和は110となります。
2つの値の各ビットのどちらかに1があれば1、両方とも0なら0になります。
次に、KeyUpイベントが発生したときに離されたキーを取得し、ビットを降ろします。
ビットを降ろすためには、論理積(AND演算子)を利用します。
2つの値の各ビットが1だったときのみ1、それ以外は0になるのが論理積です。
例えば、101と110の論理積は100となります。
今回はビットを降ろすために積を求めますから、
NOTで各キーのビットを反転したものを利用して積を求めます。
この2つのイベントで複数キーの同時判定が行えます。
ただ、今の状態では確認ができませんから、次回は動くサンプルを作ってみます。
キーが押されたかどうかの情報はビットフィールドで管理することを考えましたので、
それを定義しておきます。
ビットフィールドは列挙型で、値が2のn乗になっているだけですね。
後はその列挙型のデータを用いて5つのキー情報を管理する変数も用意しておきます。
これらの定義はKeyDownイベントとKeyUpイベントで利用しますから、フィールドとして定義しておきます。
Enum KeyList As Integer 'ビットフィールド列挙型の定義
UP = 1 '1ビット目
DOWN = 2 '2ビット目
LEFT = 4 '3ビット目
RIGHT = 8 '4ビット目
SPACE = 16 '5ビット目
End Enum
Dim ky As Integer '押されたキーのビットを管理
UP = 1 '1ビット目
DOWN = 2 '2ビット目
LEFT = 4 '3ビット目
RIGHT = 8 '4ビット目
SPACE = 16 '5ビット目
End Enum
Dim ky As Integer '押されたキーのビットを管理
上記の定義により、変数kyには00000から11111の状態が管理されます。
ビットが立っているところが押されているキー情報となります。
このビットフィールドを用いて複数キーの同時押しを判定していきます。
まず、KeyDownイベントが発生したときに、押されたキーを取得し、ビットを立てます。
ビットを立てるのは論理和(OR演算子)を利用することで行います。
論理和は2つの値のビットの和を求める方法です。
例えば、100と010の論理和は110となります。
2つの値の各ビットのどちらかに1があれば1、両方とも0なら0になります。
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.Up '上キーが押されたら
ky = ky Or KeyList.UP '1ビット目のビットを立てる
Case Keys.Down '下キーが押されたら
ky = ky Or KeyList.DOWN '2ビット目のビットを立てる
Case Keys.Left '左キーが押されたら
ky = ky Or KeyList.LEFT '3ビット目のビットを立てる
Case Keys.Right '右キーが押されたら
ky = ky Or KeyList.RIGHT '4ビット目のビットを立てる
Case Keys.Space 'スペースキーが押されたら
ky = ky Or KeyList.SPACE '5ビット目のビットを立てる
End Select
End Sub
Select Case e.KeyCode
Case Keys.Up '上キーが押されたら
ky = ky Or KeyList.UP '1ビット目のビットを立てる
Case Keys.Down '下キーが押されたら
ky = ky Or KeyList.DOWN '2ビット目のビットを立てる
Case Keys.Left '左キーが押されたら
ky = ky Or KeyList.LEFT '3ビット目のビットを立てる
Case Keys.Right '右キーが押されたら
ky = ky Or KeyList.RIGHT '4ビット目のビットを立てる
Case Keys.Space 'スペースキーが押されたら
ky = ky Or KeyList.SPACE '5ビット目のビットを立てる
End Select
End Sub
次に、KeyUpイベントが発生したときに離されたキーを取得し、ビットを降ろします。
ビットを降ろすためには、論理積(AND演算子)を利用します。
2つの値の各ビットが1だったときのみ1、それ以外は0になるのが論理積です。
例えば、101と110の論理積は100となります。
今回はビットを降ろすために積を求めますから、
NOTで各キーのビットを反転したものを利用して積を求めます。
Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
Select Case e.KeyCode
Case Keys.Up
ky = ky And Not KeyList.UP '1ビット目を降ろす
Case Keys.Down
ky = ky And Not KeyList.DOWN '2ビット目を降ろす
Case Keys.Left
ky = ky And Not KeyList.LEFT '3ビット目を降ろす
Case Keys.Right
ky = ky And Not KeyList.RIGHT '4ビット目を降ろす
Case Keys.Space
ky = ky And Not KeyList.SPACE '5ビット目を降ろす
End Select
End Sub
Select Case e.KeyCode
Case Keys.Up
ky = ky And Not KeyList.UP '1ビット目を降ろす
Case Keys.Down
ky = ky And Not KeyList.DOWN '2ビット目を降ろす
Case Keys.Left
ky = ky And Not KeyList.LEFT '3ビット目を降ろす
Case Keys.Right
ky = ky And Not KeyList.RIGHT '4ビット目を降ろす
Case Keys.Space
ky = ky And Not KeyList.SPACE '5ビット目を降ろす
End Select
End Sub
この2つのイベントで複数キーの同時判定が行えます。
ただ、今の状態では確認ができませんから、次回は動くサンプルを作ってみます。
0件のコメント
コメントの投稿
0件のトラックバック
- トラックバックURL
- http://hinagis.blog33.fc2.com/tb.php/42-5004be51
- この記事に対してトラックバックを送信する(FC2ブログユーザー)



