Entries

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

複数キー入力の同時押し判定 その2の続きです。
KeyDownイベントメソッド、KeyUpイベントメソッドを作成しただけでは本当に複数キーの同時押しが判定できているかわかりませんので、モノを作って動かしてみます。

画像を描画する際に、キーが押されていたら座標を移動させて表示させます。
そのとき、どのキーが押されているか=どのビットが立っているかを調べることで移動させるようにしています。
どのビットが立っているかは論理積で求めることができます。

また、今回のプログラムではストップウォッチで時間を計り、1秒間にどれくらい移動するかを計算せず、Paintメソッドが実行されるたびに移動するようにしています。
これは、パソコンの性能に依存してしまいますから、実際に使うときにはストップウォッチクラスを利用して時間ごとに一定量移動するよう計算しておくべきです。
今回は面倒くさかったので、そこらへんを省略しました。

ということで、プログラムは以下のような感じです。

Public Class Form1
  Enum KeyList As Integer 'ビットフィールド
    UP = 1
    DOWN = 2
    LEFT = 4
    RIGHT = 8
    SPACE = 16
  End Enum
  Dim ky As Integer '押されたキーのビットを管理
  Dim img As Bitmap = New Bitmap(10, 10) 'イメージ作成
  Dim loc As PointF = New PointF(100, 100) 'イメージの初期座標
  Dim spd As Single = 0.2 'イメージの移動速度

  Public Sub New( )
    ' この呼び出しは、Windows フォーム デザイナで必要です。
    InitializeComponent( )
    ' InitializeComponent( ) 呼び出しの後で初期化を追加します。
    Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer, True)

    Dim gr As Graphics = Graphics.FromImage(img) 'グラフィックオブジェクトの作成
    gr.FillRectangle(Brushes.Blue, New Rectangle(0, 0, img.Width, img.Height))
  End Sub

  Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    Dim g As Graphics = e.Graphics

    If (ky And KeyList.UP) <> 0 Then '1ビット目にビットが立っているか
      loc.Y -= spd 'Y座標を移動
    End If
    If (ky And KeyList.DOWN) <> 0 Then '2ビット目にビットが立っているか
      loc.Y += spd 'Y座標を移動
    End If
    If (ky And KeyList.LEFT) <> 0 Then '3ビット目にビットが立っているか
      loc.X -= spd 'X座標を移動
    End If
    If (ky And KeyList.RIGHT) <> 0 Then '4ビット目にビットが立っているか
      loc.X += spd 'X座標を移動
    End If
    If (ky And KeyList.SPACE) <> 0 Then '5ビット目にビットが立っているか
      g.FillRectangle(Brushes.LightBlue, New Rectangle(0, 0, Me.ClientSize.Width, Me.ClientSize.Height)) '画面を水色に表示
    End If
    g.DrawImage(img, loc.X, loc.Y) 'イメージの描画
    Me.Invalidate( ) '強制再描画
  End Sub

  Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    ・・・(省略)
  End Sub

  Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    ・・・(省略)  
  End Sub
End Class

これで実行すると以下のようなフォームが表示され、カーソルキーやスペースキーを同時押しをすれば青い四角形が移動したり、フォームが水色に変化したりします。
キー判定1

0件のコメント

コメントの投稿

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

0件のトラックバック

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

Appendix

最新記事

検索フォーム

月別アーカイブ

売れ筋ランキング

お楽しみ用

アニメグッズ

プロフィール

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

FC2カウンター

Powered By FC2ブログ

今すぐブログを作ろう!

Powered By FC2ブログ

FC2ブログ 一戸建て