カテゴリー
Visual Basic

ラケットでボールを打ち返す

画面上でボールが動くようになったので、次はラケットを用意してボールを打ち返すようにしてみましょう。

まずはラケットをフォーム上に配置します。これもLabelで十分でしょう。
NameプロパティをRacketにします。
AutoSizeプロパティをFalseにすると、ラケットのラベルのサイズを自由に変更できます。
BackColorもお好みの色に設定します。

ラケットの準備ができたので、ラケットをマウスで動かせるようにします。

フォーム(Form1)のプロパティでイベントを選択してMouseMoveをダブルクリックします。
すると、MouseMoveイベントプロシージャが作られます。
マウスの位置に、ラケットの座標を合わせるようにします。

    Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove
        Racket.Left = e.X
    End Sub

マウスカーソルの動きに、ラケットが追従するようになります。

次はラケットとボールの当たり判定を追加します。
タイマーイベント内に追加しましょう。

ラケットとボールの当たり判定は、二つのコントロール(Label)に重なり部分があるかどうかを調べます。RectangleクラスにIntersectsWithという便利な関数がありますので、それを利用します。
ラケットの範囲を表すRectangleとボールの範囲を表すRectangleを用意して、重なりがあるかどうかを調べます。

ボールの範囲を表すRectangleの変数を「br」、ラケットの範囲を表すRectangleの変数を「rr」としています。

あと、ラケットの当たり判定をするのは、dy > 0 の場合だけにします。ボールがラケットの下の方に当たって上向きに動いたときは、直後にも当たり判定されてしまう可能性があるのですが、これを避けるために、ボールが上方向に動くときは判定しないようにします。

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If x + dx <= 0 Or x + Ball.Width + dx > ClientSize.Width Then
            dx = -dx
        End If
        If y + dy <= 0 Or y + Ball.Height + dy > ClientSize.Height Then
            dy = -dy
        End If
        x = x + dx
        y = y + dy
        Ball.Left = x
        Ball.Top = y

        Dim br, rr As Rectangle
        br = New Rectangle(x, y, Ball.Width, Ball.Height)
        rr = New Rectangle(Racket.Left, Racket.Top, Racket.Width, Racket.Height)
        If rr.IntersectsWith(br) And dy > 0 Then
            dy = -dy
        End If
    End Sub