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

Ruby2d中正方形与圆形碰撞检测实现求助

修复Ruby2D中正方形与圆形的碰撞检测问题

我看了你的代码,发现几个关键问题导致碰撞检测没生效,现在帮你修改好了,具体调整和说明如下:

原代码的问题点

  • 正方形初始化时用了未定义的@x和@y,会直接报错
  • 碰撞检测逻辑错误:仅判断圆心和正方形中心坐标完全相等,这种情况几乎不可能触发
  • 碰撞判断只执行了一次:初始化后就不再检查,没有在每一帧的update循环里持续检测
  • 碰撞后的remove+add逻辑无效,无法正确重置圆形位置

修改后的完整代码

require 'ruby2d'
set title: 'Merdeka', background: 'olive'
set width: 600, height: 500

# 初始化正方形,给初始坐标(屏幕中心)
@x = 300
@y = 250
s = Square.new(x: @x, y: @y, size: 25, color: 'navy', z: 10)

# 初始化随机位置的圆形
def spawn_circle
  Circle.new(x: rand(600), y: rand(500), radius: 11, sectors: 32, color: 'maroon', z: 10)
end
a = spawn_circle

@x_speed = 0
@y_speed = 0

on :key_down do |event|
  case event.key
  when 'up'
    @x_speed = 0
    @y_speed = -2
  when 'right'
    @x_speed = 2
    @y_speed = 0
  when 'down'
    @x_speed = 0
    @y_speed = 2
  when 'left'
    @x_speed = -2
    @y_speed = 0
  end
end

# 正确的轴对齐正方形与圆形碰撞检测方法
def circle_square_collision(circle, square)
  # 计算圆心到正方形最近点的坐标
  closest_x = [square.x, [circle.x, square.x + square.size].min].max
  closest_y = [square.y, [circle.y, square.y + square.size].min].max

  # 计算距离的平方(避免开根号,提升性能)
  distance_squared = (circle.x - closest_x)**2 + (circle.y - closest_y)**2

  # 比较距离平方和半径平方
  distance_squared <= circle.radius**2
end

update do
  # 更新正方形位置
  s.x += @x_speed
  s.y += @y_speed

  # 每帧检测碰撞
  if circle_square_collision(a, s)
    a.remove # 移除当前圆形
    a = spawn_circle # 生成新的随机位置圆形
  end
end

show

关键修改说明

  1. 初始化修复:给正方形的初始坐标@x和@y赋值为屏幕中心,避免未定义错误
  2. 碰撞算法优化:使用轴对齐矩形与圆形的标准碰撞检测逻辑——计算圆心到正方形最近点的距离,和半径比较,确保能准确检测碰撞
  3. 持续检测:把碰撞判断移到update循环内,每帧都会检查是否碰撞
  4. 碰撞后逻辑改进:封装了spawn_circle方法,碰撞后移除旧圆形并生成新的随机位置圆形,实现碰撞后的重置效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:56:08