Home > Back-end >  collision between two picturesbox in Visual basic 2019
collision between two picturesbox in Visual basic 2019

Time:01-28

I'm trying to create a simple game where my character has deal with a maze, in visual basic 2019 I cannot stop my character(picturebox) from passing through a wall(picturebox). I have to say that I am far away from an expert and it's just an important project for school.

I tried this

Dim colliding As Boolean = False
For Each PictureBox In Me.Controls
    If PictureBox1.Bounds.IntersectsWith(PictureBox.Bounds) Then
        colliding = True
    Else
        colliding = False
    End If
Next

and this

Dim colliding As Boolean = False
For Each PictureBox In Me.Controls 
    If PictureBox IsNot PictureBox1 AndAlso PictureBox21.Bounds.IntersectsWith(PictureBox.Bounds) Then
        colliding = True
    Else
        colliding = False
    End If 
Next

in both attends I failed hard, and my character (picturebox1) can still pass through a wall

CodePudding user response:

Code assumes that all PictureBoxes are DIRECTLY contained by the Form itself (they are not inside another container like a Panel), and that anything besides PictureBox1 is a wall:

Dim colliding As Boolean = False
For Each PB As PictureBox In Me.Controls.OfType(Of PictureBox)
    If PB IsNot PictureBox1 Then
        If PB.Bounds.IntersectsWith(PictureBox1.Bounds) Then
            colliding = True
            Exit For
        End If
    End If
Next

An alternate approach using a bit of LINQ:

Public Class Form1

    Private Walls As New List(Of PictureBox)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Walls = Me.Controls.OfType(Of PictureBox).Where(Function(pb) pb IsNot PictureBox1).ToList
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim colliding As Boolean = Walls.Any(Function(pb) pb.Bounds.IntersectsWith(PictureBox1.Bounds))
    End Sub


End Class

CodePudding user response:

Here is another option for dealing with the collision. This assumes 4 buttons to move the 'character'

   Private Enum MoveDirection
        Left
        Down
        Right
        Up
    End Enum

    Private Sub RightButton_Click(sender As Object, e As EventArgs) Handles RightButton.Click
        MovePicBox(CharacterPicBox, MoveDirection.Right)
    End Sub

    Private Sub LeftButton_Click(sender As Object, e As EventArgs) Handles LeftButton.Click
        MovePicBox(CharacterPicBox, MoveDirection.Left)
    End Sub

    Private Sub UpButton_Click(sender As Object, e As EventArgs) Handles UpButton.Click
        MovePicBox(CharacterPicBox, MoveDirection.Up)
    End Sub

    Private Sub DownButton_Click(sender As Object, e As EventArgs) Handles DownButton.Click
        MovePicBox(CharacterPicBox, MoveDirection.Down)
    End Sub

    Private Sub MovePicBox(PicBox As PictureBox, movement As MoveDirection)

        'save the old location to move the pic box back if a clash occurs
        Dim oldLocation As Point = PicBox.Location
        Dim newLocation As Point
        Dim stepSize As Integer = 50

        'calculate new position
        Select Case movement
            Case MoveDirection.Down
                newLocation.X = oldLocation.X
                newLocation.Y = oldLocation.Y   stepSize
            Case MoveDirection.Left
                newLocation.X = oldLocation.X - stepSize
                newLocation.Y = oldLocation.Y
            Case MoveDirection.Up
                newLocation.X = oldLocation.X
                newLocation.Y = oldLocation.Y - stepSize
            Case MoveDirection.Right
                newLocation.X = oldLocation.X   stepSize
                newLocation.Y = oldLocation.Y
        End Select

        'move the picture box
        PicBox.Location = newLocation

        'check if it has collided
        For Each wallPicBox As PictureBox In Me.Controls.OfType(Of PictureBox)
            If wallPicBox Is PicBox Then
                Continue For
            End If
            If PicBox.Bounds.IntersectsWith(wallPicBox.Bounds) Then
                'move it back
                PicBox.Location = oldLocation
            End If
        Next

    End Sub
  • Related