You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Basic 2019中PictureBox碰撞检测失效,角色穿墙问题求助

VB 2019迷宫游戏角色穿墙问题修复方案

我正在用Visual Basic 2019开发一款简易迷宫游戏,目前遇到角色(PictureBox1)可穿过墙体(PictureBox)的问题。这是一项重要的学校项目,但我并非编程专家。我尝试了以下两段代码,但均未成功解决问题,角色仍能穿墙:

第一段代码:

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

第二段代码:

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

代码问题分析

  1. 碰撞状态被循环覆盖:每次遍历控件都会重置colliding的值,哪怕之前检测到碰撞,只要下一个控件无碰撞,状态就会被改成False,最终只有最后一个控件的检测结果生效。
  2. 第二段代码对象错误:误将PictureBox21作为检测对象,而非角色的PictureBox1,等于检测了错误的控件。

修正后的代码

Dim colliding As Boolean = False
' 遍历所有控件,仅检测墙体PictureBox(排除角色自身)
For Each ctrl As Control In Me.Controls
    If TypeOf ctrl Is PictureBox AndAlso ctrl IsNot PictureBox1 Then
        If PictureBox1.Bounds.IntersectsWith(ctrl.Bounds) Then
            colliding = True
            Exit For ' 检测到碰撞后直接跳出循环,无需继续检查
        End If
    End If
Next

' 碰撞处理:如果检测到碰撞,将角色移回移动前的位置
If colliding Then
    ' 需提前保存角色移动前的坐标,例如prevX和prevY
    PictureBox1.Location = New Point(prevX, prevY)
End If

关键改进说明

  • 仅筛选PictureBox类型控件,避免误检测按钮、标签等其他控件
  • 检测到碰撞后立即退出循环,提升运行效率
  • 排除角色自身控件,避免无意义的自我碰撞检测
  • 添加碰撞后的位置回退逻辑——这是阻止穿墙的核心:光检测碰撞不够,必须让角色无法进入墙体区域

内容的提问来源于stack exchange,提问作者Joana Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:15:40