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

旋转圆形(行星)与Label边界碰撞检测问题排查

问题根源

你当前的碰撞检测失效,核心原因是仅通过Graphics的旋转变换绘制行星,但Planet矩形的实际坐标从未更新——绘图变换只是改变了视觉呈现角度,Planet始终停留在初始位置,碰撞检测拿的是旧坐标,自然无法识别和Label的真实碰撞。

解决方案

放弃依赖绘图变换定位行星,改用三角函数实时计算行星的屏幕真实坐标,同步更新Planet矩形的位置,让碰撞检测使用当前帧的真实坐标。

修改后的完整代码
Public Sub circleDetection(circle As Rectangle)
    If Label1.Bounds.IntersectsWith(circle) Then
        ' 修正为屏幕右上角(原代码是左上角)
        Label1.Top = 0
        Label1.Left = Me.ClientSize.Width - Label1.Width
        MsgBox("you DIED!")
    End If
End Sub

Private WithEvents TMcircle As New Timer
Dim SunCentre As New Point(300, 300)
Dim OrbitRadius As Integer = 150
Dim PlanetDiameter As Integer = 10
Dim Planet As New Rectangle(0, 0, PlanetDiameter, PlanetDiameter) ' 初始值后续会覆盖
Dim Angle As Single

Private Sub Tmr_Tick(sender As Object, e As System.EventArgs) Handles TMcircle.Tick
    Angle += 1
    ' 将角度转换为弧度(VB三角函数基于弧度计算)
    Dim radian As Single = Angle * Math.PI / 180
    ' 计算行星中心的屏幕坐标
    Dim planetCenterX As Integer = SunCentre.X + CInt(OrbitRadius * Math.Cos(radian))
    Dim planetCenterY As Integer = SunCentre.Y + CInt(OrbitRadius * Math.Sin(radian))
    ' 更新Planet矩形,使其中心与计算出的坐标对齐
    Planet = New Rectangle(planetCenterX - PlanetDiameter \ 2, planetCenterY - PlanetDiameter \ 2, PlanetDiameter, PlanetDiameter)
    Invalidate()
    circleDetection(Planet)
End Sub

Public Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    ' 绘制中心太阳(可选)
    e.Graphics.FillEllipse(Brushes.Yellow, SunCentre.X - 20, SunCentre.Y - 20, 40, 40)
    ' 直接使用更新后的Planet坐标绘制行星,无需变换
    e.Graphics.FillEllipse(Brushes.Blue, Planet)
End Sub
关键修改说明
  1. 实时计算行星坐标:用Math.Cos和Math.Sin基于角度计算行星在屏幕上的真实位置,确保Planet矩形始终对应当前帧的行星位置。
  2. 修正Label移动位置:原代码将Label移至左上角,改为Me.ClientSize.Width - Label1.Width实现右上角定位。
  3. 移除绘图变换:直接使用真实坐标绘制行星,避免视觉位置和数据位置脱节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:05:18