碰撞问题弹球VB.net 2015

时间:2016-03-17 13:23:55

标签: vb.net vector picturebox collision detection

所以我正在使用vb.net制作一个基本的弹球游戏,并且我遇到了碰撞的问题,一旦球减速一定量,它会在内部发生故障然后穿过墙壁。

我正在使用墙壁和球的图片框,并使用相交(picturebox命令来检测碰撞。

如何解决这个问题的任何帮助将不胜感激。感谢

贝娄是大部分代码:( pctball是球)

 Private Sub Screen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    DoubleBuffered = True
    dX = 6 ' Pixels per timer tick
    dY = 6

    Timer1.Enabled = True

    'array for colliding scores
    For Each obj In Me.Controls
        If TypeOf obj Is PictureBox AndAlso obj.tag = "Disc" Then
            DiscArray(i) = obj
            i += 1
        End If
    Next


End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    If GameActive = True Then

        Labelx.Text = PctBall.Left
        Labely.Text = PctBall.Top

        PctBall.Left = PctBall.Left + dX
        PctBall.Top = PctBall.Top + dY

        ' check for ball hitting edges, reverse direction if so
        If PctBall.Left < 10 Or PctBall.Left > MyBase.Width - PctBall.Width Then
            dX = -dX
        End If

        If PctBall.Top < 10 Then
            dY = -dY
        End If

        If LeftFlipper = True Then
            FlipperDefaultL.Visible = False
            FlipperUpL.Visible = True
        Else
            FlipperDefaultL.Visible = True
            FlipperUpL.Visible = False
        End If

        If RightFlipper = True Then
            FlipperDefaultR.Visible = False
            FlipperUpR.Visible = True
        Else
            FlipperDefaultR.Visible = True
            FlipperUpR.Visible = False
        End If

        GravityFunction()

        ReboundAngle()


        ' If ball goes outside bottom
        If PctBall.Bottom > MyBase.Height Then
            GameActive = False
            Game_Over()
        End If


    End If


End Sub
Private Sub Keys_Down(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyValue
        Case Keys.Space
            GameActive = True
        Case Keys.D
            LeftFlipper = True
        Case Keys.K
            RightFlipper = True

    End Select

End Sub

Private Sub Keys_Up(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
    Select Case e.KeyValue
        'Case Keys.Space
        '    GameActive = False
        Case Keys.D
            LeftFlipper = False
        Case Keys.K
            RightFlipper = False

    End Select
End Sub

Private Sub GravityFunction()
    ' gravity
    gravity = CollisionCount
    dY += gravity
    PctBall.Top += dY

End Sub

Private Function CheckCollision()

    For Each PictureBox In Me.Controls
        If PictureBox IsNot PctBall AndAlso PictureBox.visible = True AndAlso PctBall.Bounds.IntersectsWith(PictureBox.Bounds) Then
            collision = True
            CollisionCount += 0.1
            For discCount = 0 To DiscArray.Length - 1
                If PictureBox IsNot PctBall AndAlso PctBall.Bounds.IntersectsWith(DiscArray(discCount).Bounds) Then
                    score = score + 1
                    ScoreBoard.scorelabel.Text = "Score: " & score
                End If
            Next
            Exit For 'Exit when at least one collision found 
        Else : collision = False
        End If
    Next

    If Collision = True Then
        Coll.Text = "True"
    Else
        Coll.Text = "False"
    End If
    Return collision

End Function

Private Function ReboundAngle()

    If CheckCollision() Then
        dX = -dX
        dY = -dY
    End If

End Function

0 个答案:

没有答案