Entries

複数キー入力の同時押し判定 その2

複数キー入力の同時押し判定 その1の続きです。
キーが押されたかどうかの情報はビットフィールドで管理することを考えましたので、
それを定義しておきます。
ビットフィールドは列挙型で、値が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 '押されたキーのビットを管理

上記の定義により、変数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

次に、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

この2つのイベントで複数キーの同時判定が行えます。
ただ、今の状態では確認ができませんから、次回は動くサンプルを作ってみます。

0件のコメント

コメントの投稿

新規
投稿した内容は管理者にだけ閲覧出来ます

0件のトラックバック

トラックバックURL
http://hinagis.blog33.fc2.com/tb.php/42-5004be51
この記事に対してトラックバックを送信する(FC2ブログユーザー)

Appendix

最新記事

検索フォーム

月別アーカイブ

売れ筋ランキング

お楽しみ用

アニメグッズ

プロフィール

Author:ひなぎ
VB2005&2008でゲーム作成中

FC2カウンター

Powered By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

FC2ブログ 一戸建て