素人がゲームプログラム作成に挑戦
ゲームを買うお金がないから、ゲームを作るというゲームに挑戦!言語はVisual Basic(VB)をメインにC++、C#、Javaは参考程度
Entries
複数キー入力の同時押し判定 その3
- ジャンル : コンピュータ
- スレッドテーマ : Visual Basic
複数キー入力の同時押し判定 その2の続きです。
KeyDownイベントメソッド、KeyUpイベントメソッドを作成しただけでは本当に複数キーの同時押しが判定できているかわかりませんので、モノを作って動かしてみます。
画像を描画する際に、キーが押されていたら座標を移動させて表示させます。
そのとき、どのキーが押されているか=どのビットが立っているかを調べることで移動させるようにしています。
どのビットが立っているかは論理積で求めることができます。
また、今回のプログラムではストップウォッチで時間を計り、1秒間にどれくらい移動するかを計算せず、Paintメソッドが実行されるたびに移動するようにしています。
これは、パソコンの性能に依存してしまいますから、実際に使うときにはストップウォッチクラスを利用して時間ごとに一定量移動するよう計算しておくべきです。
今回は面倒くさかったので、そこらへんを省略しました。
ということで、プログラムは以下のような感じです。
これで実行すると以下のようなフォームが表示され、カーソルキーやスペースキーを同時押しをすれば青い四角形が移動したり、フォームが水色に変化したりします。

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

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



