Vb.net 碰撞检测与图像识别问题

Vb.net 碰撞检测与图像识别问题,vb.net,Vb.net,关于碰撞检测,我还有一个问题。我目前正在使用PictureBox制作下落物体,其中这些PictureBox的图像以随机方式从我创建的imagelist中获取。问题是,有两种类型的图像;一条鱼和一枚硬币。我想做的是让程序识别某次碰撞的图像(如果是硬币或不是),并更新绑定硬币过程的标签。我尝试过各种方法,但似乎无法找出问题的根源。谁能帮帮我吗 到目前为止,我有以下代码: 'Collision If PictureBox1.Bounds.IntersectsWith(play_avatar.B

关于碰撞检测,我还有一个问题。我目前正在使用PictureBox制作下落物体,其中这些PictureBox的图像以随机方式从我创建的imagelist中获取。问题是,有两种类型的图像;一条鱼和一枚硬币。我想做的是让程序识别某次碰撞的图像(如果是硬币或不是),并更新绑定硬币过程的标签。我尝试过各种方法,但似乎无法找出问题的根源。谁能帮帮我吗

到目前为止,我有以下代码:

'Collision
    If PictureBox1.Bounds.IntersectsWith(play_avatar.Bounds) Then
        If PictureBox1.ImageLocation Is My.Resources.coin Then
            cns += 1
            lbl_coins.Text += cns
        End If
        PictureBox1.Top -= Panel1.Height
        PictureBox1.Image.Dispose()
        PictureBox1.Image = ImageList1.Images(rno1)
        scr += 1
        lbl_score.Text += scr
    End If
    If PictureBox2.Bounds.IntersectsWith(play_avatar.Bounds) Then
        If PictureBox1.ImageLocation Is My.Resources.coin Then
            cns += 1
            lbl_coins.Text += cns
        End If
        PictureBox2.Top -= Panel1.Height
        PictureBox2.Image.Dispose()
        PictureBox2.Image = ImageList1.Images(rno2)
        scr += 1
        lbl_score.Text += scr
    End If
    If PictureBox3.Bounds.IntersectsWith(play_avatar.Bounds) Then
        If PictureBox3.ImageLocation Is My.Resources.coin Then
            cns += 1
            lbl_coins.Text += cns
        End If
        PictureBox3.Top -= Panel1.Height
        PictureBox3.Image.Dispose()
        PictureBox3.Image = ImageList1.Images(rno3)
        scr += 1
        lbl_score.Text += scr
    End If
这是图像列表及其随机函数:

    ImageList1.Images.Add(My.Resources.coin)
    ImageList1.Images.Add(My.Resources.f1)
    ImageList1.Images.Add(My.Resources.f2)
    ImageList1.Images.Add(My.Resources.f3)
    ImageList1.Images.Add(My.Resources.f4)
    ImageList1.Images.Add(My.Resources.f5)
    ImageList1.Images.Add(My.Resources.f6)
    ImageList1.Images.Add(My.Resources.f7)
    ImageList1.Images.Add(My.Resources.f8)
    ImageList1.Images.Add(My.Resources.f9)


Dim cns As Integer = 0
Dim rnd As New Random
Dim rno1 As Integer
Dim rno2 As Integer
Dim rno3 As Integer

rno1 = rnd.Next(0, 10)
rno2 = rnd.Next(0, 10)
rno3 = rnd.Next(0, 10)
编辑:

这是全部代码

Imports System.IO

Public Class EClassic
Dim images() As String
Dim rnd As New Random
Dim rno1 As Integer
Dim rno2 As Integer
Dim rno3 As Integer
Dim flist As New List(Of PictureBox)
Dim dlist As New List(Of Image)
Dim scr As Integer = 0
Dim life As Integer = 5
Dim cns As Integer = 0
Dim picturebox1ImageIndex, picturebox2ImageIndex, picturebox3ImageIndex As Integer
Private Sub EClassic_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    With flist
        .Add(PictureBox1)
        .Add(PictureBox2)
        .Add(PictureBox3)
    End With
    lbl_score.Text = scr
    lbl_life.Text = life
    lbl_coins.Text = cns

End Sub
Private Sub EClassic_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    Dim c As Integer = Panel1.ClientSize.Width
    Dim res As Integer
    Dim res2 As Integer
    res2 = c - c + 100
    res = c / 2

    Select Case e.KeyCode
        Case Keys.Left
            If play_avatar.Left > res2 Then
                play_avatar.Left -= 100
            ElseIf play_avatar.Left < res2 Then
                play_avatar.Left -= 0
            End If

        Case Keys.Right
            If play_avatar.Left < res Then
                play_avatar.Left += 100
            ElseIf play_avatar.Left > res Then
                play_avatar.Left -= 0

            End If

    End Select
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Dim mov As Integer = rnd.Next(0, flist.Count - 0)
    Me.flist(mov).Top += 20
    'Fish - Dragon Collision
    If PictureBox1.Bounds.IntersectsWith(play_avatar.Bounds) Then
        PictureBox1.Image.Dispose()
        PictureBox1.Top -= Panel1.Height
        rno1 = rnd.Next(0, 9)
        PictureBox1.Image = ImageList1.Images(rno1)
        picturebox1ImageIndex = rno1
        scr += 1
        lbl_score.Text += scr
        If picturebox1ImageIndex = 0 Then '0 is the index of coin in ImageList1
            cns += 1
            lbl_coins.Text += cns
        End If
    End If
    If PictureBox2.Bounds.IntersectsWith(play_avatar.Bounds) Then
        PictureBox2.Image.Dispose() 
        PictureBox2.Top -= Panel1.Height
        rno2 = rnd.Next(0, 9)
        PictureBox2.Image = ImageList1.Images(rno2)
        picturebox2ImageIndex = rno2
        scr += 1
        lbl_score.Text += scr
        If picturebox2ImageIndex = 0 Then 
            lbl_coins.Text += cns
        End If
    End If

    If PictureBox3.Bounds.IntersectsWith(play_avatar.Bounds) Then
        PictureBox3.Image.Dispose()
        PictureBox3.Top -= Panel1.Height
        rno3 = rnd.Next(0, 9)
        PictureBox3.Image = ImageList1.Images(rno3)
        picturebox3ImageIndex = rno3
        scr += 1
        lbl_score.Text += scr
        If picturebox3ImageIndex = 0 Then
            cns += 1
            lbl_coins.Text += cns
        End If
    End If

    'Fish - Line Collision
    If PictureBox1.Bounds.IntersectsWith(line.Bounds) Then
        life -= 1
        PictureBox1.Top -= Panel1.Height
        lbl_life.Text = life
    End If
    If PictureBox2.Bounds.IntersectsWith(line.Bounds) Then
        life -= 1
        PictureBox2.Top -= Panel1.Height
        lbl_life.Text = life
    End If
    If PictureBox3.Bounds.IntersectsWith(line.Bounds) Then
        life -= 1
        PictureBox3.Top -= Panel1.Height
        lbl_life.Text = life
    End If
    If life = 0 Then
        Timer1.Stop()
        GameOver.Show()
        Exit Sub
    End If
End Sub
Imports System.IO
公开课
Dim images()作为字符串
Dim rnd作为新的随机变量
作为整数的Dim rno1
作为整数的Dim rno2
作为整数的Dim rno3
Dim flist作为新列表(PictureBox)
变暗数据列表作为新列表(图像)
将scr设置为整数=0
调暗寿命为整数=5
将cns设置为整数=0
Dim picturebox1ImageIndex、picturebox2ImageIndex、picturebox3ImageIndex为整数
私有子类EClassic_Load(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
用飞片
.Add(图1)
.添加(图片B)
.Add(图片box3)
以
lbl_score.Text=scr
lbl_life.Text=寿命
lbl_coins.Text=cns
端接头
Private Sub-eclassicu KeyDown(ByVal sender作为对象,ByVal e作为System.Windows.Forms.KeyEventArgs)处理Me.KeyDown
尺寸c为整数=Panel1.ClientSize.Width
Dim res作为整数
Dim res2为整数
res2=c-c+100
res=c/2
选择Case e.KeyCode
箱子钥匙,左边
如果播放_avatar.Left>res2,则
播放化身。左-=100
如果播放头像,则左<右2
播放化身。左-=0
如果结束
箱子钥匙,对吗
如果播放_avatar.Left右
播放化身。左-=0
如果结束
结束选择
端接头
私有子Timer1_Tick(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理Timer1.Tick
Dim mov As Integer=rnd.Next(0,flist.Count-0)
Me.flist(mov.Top+=20
"鱼龙相撞",
如果PictureBox1.Bounds.IntersectsWith(play_avatar.Bounds)则
PictureBox1.Image.Dispose()
图B1.顶部-=面板1.高度
rno1=rnd.Next(0,9)
PictureBox1.Image=ImageList1.Images(rno1)
picturebox1ImageIndex=rno1
scr+=1
lbl_score.Text+=scr
如果picturebox1ImageIndex=0,则“0”是ImageList1中硬币的索引
中枢神经系统+=1
lbl_coins.Text+=cns
如果结束
如果结束
如果PictureBox2.Bounds.IntersectsWith(play_avatar.Bounds)则
PictureBox2.Image.Dispose()
图2.顶部-=面板1.高度
rno2=rnd.下一个(0,9)
PictureBox2.Image=ImageList1.Images(rno2)
picturebox2ImageIndex=rno2
scr+=1
lbl_score.Text+=scr
如果picturebox2ImageIndex=0,则
lbl_coins.Text+=cns
如果结束
如果结束
如果PictureBox3.Bounds.IntersectsWith(play_avatar.Bounds),则
PictureBox3.Image.Dispose()
图B x3.顶部-=面板1.高度
rno3=rnd.Next(0,9)
PictureBox3.Image=ImageList1.Images(rno3)
picturebox3ImageIndex=rno3
scr+=1
lbl_score.Text+=scr
如果picturebox3ImageIndex=0,则
中枢神经系统+=1
lbl_coins.Text+=cns
如果结束
如果结束
"鱼线碰撞",
如果PictureBox1.Bounds.Intersects与(line.Bounds)相交,则
寿命-=1
图B1.顶部-=面板1.高度
lbl_life.Text=寿命
如果结束
如果PictureBox2.Bounds.Intersects与(line.Bounds)相交,则
寿命-=1
图2.顶部-=面板1.高度
lbl_life.Text=寿命
如果结束
如果PictureBox3.Bounds.Intersects与(line.Bounds)相交,则
寿命-=1
图B x3.顶部-=面板1.高度
lbl_life.Text=寿命
如果结束
如果寿命=0,则
计时器1.Stop()
GameOver.Show()
出口接头
如果结束
端接头
End Class

PictureBox1.ImageLocation是My.Resources.coin有两种错误:

1。比较字符串和位图。启用选项strict

2。即使您使用PictureBox1.Image是My.Resources.coin,它也将始终为false,因为它是另一个对象

您应该为每个picturebox使用一个变量,例如picturebox1ImageIndex、picturebox2ImageIndex和compare

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim mov As Integer = rnd.Next(0, flist.Count - 0)
Me.flist(mov).Top += 20
'Fish - Dragon Collision
If PictureBox1.Bounds.IntersectsWith(play_avatar.Bounds) Then
    'PictureBox1.Image.Dispose()   ' you dont need that
    PictureBox1.Top -= Panel1.Height '<- place break point. See if this code is triggered
    rno1 = rnd.Next(0, 9)
    PictureBox1.Image = ImageList1.Images(rno1) '<- place break point check rno1 
    picturebox1ImageIndex = rno1
    scr += 1 '<- place break point check picturebox1ImageIndex 
    lbl_score.Text += scr
    If picturebox1ImageIndex = 0 Then '<- place break point
        cns += 1 '<- place break point
        lbl_coins.Text += cns
    End If
End If
If PictureBox2.Bounds.IntersectsWith(play_avatar.Bounds) Then
    'PictureBox2.Image.Dispose()   ' you dont need that
    PictureBox2.Top -= Panel1.Height '<- place break point. See if this code is triggered
    rno2 = rnd.Next(0, 9)
    PictureBox2.Image = ImageList1.Images(rno2) '<- place break point check rno2
    picturebox2ImageIndex = rno2
    scr += 1 '<- place break point check picturebox2ImageIndex 
    lbl_score.Text += scr
    If picturebox2ImageIndex = 0 Then  '<- place break point
        lbl_coins.Text += cns '<- place break point
    End If
End If

If PictureBox3.Bounds.IntersectsWith(play_avatar.Bounds) Then
    'PictureBox3.Image.Dispose() ' you dont need that
    PictureBox3.Top -= Panel1.Height '<- place break point. See if this code is triggered
    rno3 = rnd.Next(0, 9)
    PictureBox3.Image = ImageList1.Images(rno3) '<- place break point check rno3
    picturebox3ImageIndex = rno3
    scr += 1 '<- place break point check picturebox3ImageIndex
    lbl_score.Text += scr
    If picturebox3ImageIndex = 0 Then '<- place break point
        cns += 1 '<- place break point
        lbl_coins.Text += cns
    End If
End If

'Fish - Line Collision
If PictureBox1.Bounds.IntersectsWith(line.Bounds) Then
    life -= 1
    PictureBox1.Top -= Panel1.Height
    lbl_life.Text = life
End If
If PictureBox2.Bounds.IntersectsWith(line.Bounds) Then
    life -= 1
    PictureBox2.Top -= Panel1.Height
    lbl_life.Text = life
End If
If PictureBox3.Bounds.IntersectsWith(line.Bounds) Then
    life -= 1
    PictureBox3.Top -= Panel1.Height
    lbl_life.Text = life
End If
If life = 0 Then
    Timer1.Stop()
    GameOver.Show()
    Exit Sub
End If
End Sub
Private Sub Timer1\u Tick(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理Timer1.Tick
Dim mov As Integer=rnd.Next(0,flist.Count-0)
Me.flist(mov.Top+=20
"鱼龙相撞",
如果PictureBox1.Bounds.IntersectsWith(play_avatar.Bounds)则
'PictureBox1.Image.Dispose()'您不需要它

PictureBox1.Top-=面板1.Height'实际问题是什么?你只说了你想让代码做什么,而不是它现在做什么。我想程序不知道它是不是硬币,所有的东西都是一样的(鱼)。我怎样才能让程序在随机分组后立即识别它是否是一枚硬币?或者我认为随机化后也行。。我完全迷路了。也许这就是问题所在,不是吗
如果PictureBox1.ImageLocation是My.Resources.coin,那么cns+=1 lbl_coins.Text+=cns End If
,因为在这种情况下,cns(实际上是硬币计数器)没有更新。你能分享一些解决方法吗?我似乎找不到办法,对不起。@γηράσκω′αείπολλλάδασκμε谢谢你。虽然看起来有点小问题。请参见编辑:@Chris,你是说rno1获得随机值,然后再次更改?我不明白。@γηρσ