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
关键修改说明
- 初始化修复:给正方形的初始坐标
@x和@y赋值为屏幕中心,避免未定义错误 - 碰撞算法优化:使用轴对齐矩形与圆形的标准碰撞检测逻辑——计算圆心到正方形最近点的距离,和半径比较,确保能准确检测碰撞
- 持续检测:把碰撞判断移到
update循环内,每帧都会检查是否碰撞 - 碰撞后逻辑改进:封装了
spawn_circle方法,碰撞后移除旧圆形并生成新的随机位置圆形,实现碰撞后的重置效果
内容的提问来源于stack exchange,提问作者import_hill
相关产品推荐
相关产品推荐

