カテゴリー
Visual Basic

ボールがブロックの側面に当たった時の動作

現状では、ボールがブロックの側面に当たっても、ボールは下向きに跳ね返ります。

しかしこの動きは不自然です。

ボールがブロックの側面に当たったときは、両側の壁に当たった時と同じようにx軸方向に跳ね返り、縦方向の動きは変わらないほうが自然です。

この動きを作ってみましょう。

ボールがブロックの側面に当たったかどうかは、ボールがブロックと当たった瞬間の重なり部分の形状で判断できます。

ボールがブロックの上の面または下の面に当たると、重なり部分は横長の四角形になります。これに対して、ボールがブロックの側面に当たると、重なり部分は縦長の四角形になります。

重なり部分の四角形は、Rectangleが持っているIntersects関数で取得できます。

重なり部分の四角形の幅と高さを比較して、幅が大きければ上の面または下の面、高さが大きければ側面に当たったと判断できます。

    Public Sub HitBlock()
        Dim i, j As Integer
        Dim r, br As Rectangle
        Dim b As Label

        br = New Rectangle(x, y, Ball.Width, Ball.Height)
        For i = 0 To 9
            For j = 0 To 5
                b = block(i, j)
                r = New Rectangle(b.Left, b.Top, b.Width, b.Height)
                If b.Visible = True And r.IntersectsWith(br) Then
                    Dim overlap As Rectangle
                    overlap = Rectangle.Intersect(r, br)
                    If overlap.Width > overlap.Height Then
                        dy = -dy
                    Else
                        dx = -dx
                    End If
                    b.Visible = False
                    score += 1
                    Exit Sub
                End If
            Next
        Next
    End Sub