我试图在Ruby中的Gosu中编写hitboxes,并希望检查2个范围是否满足(范围是坐标),我希望它简单地给予true或false
我查过了,找到了射程。掩护?代码,但在测试后,这表明它只检查一个范围是否完全适合另一个范围,而不是如果它们只是部分连接。
#both sprites are arrays, with the following structure
#[image_data, sprite_x, sprite_y]
#image_data.width would return how wide the image is
#The x and y is the top left of the sprite
def hit_scan(sprite1, sprite2)
x_connect = (sprite1[1]..sprite1[1] + sprite1[0].width).cover?(sprite2[1]..(sprite2[1] + sprite2[0].width))
y_connect = (sprite1[2]..sprite1[2] + sprite1[0].height).cover?(sprite2[2]..(sprite2[2] + sprite2[0].height)
if x_connect == true
if y_connect == true
return true
else
return false
end
else
return false
end
end
这就是我尝试的,只有当整个精灵都在另一个精灵中时才返回true。
我期望每当精灵接触时,它会返回一个true语句,但只有当一个精灵在另一个精灵中时,它才会返回true。
5条答案
按热度按时间bmvo0sr51#
您可以检查一个范围是否包含另一个范围的开始或结束:
在您的案例中:
假设范围不是无限的。
vqlkdk9b2#
正如@muistooshort在评论中指出的那样,有许多情况需要考虑。
我假设范围的元素是整数,如示例中所示。
编码
确定两个范围是否相交的最简单方法是对确定它们是否不相交的表达式求反。
示例
观察第3个示例中的范围
3..1
为空。另请注意:
如果两个值域
r1
和r2
是有限的,并且是两点簇,则可以用r.last
替换range_last(r)
。j91ykkif3#
如果你没有无限的范围,也许你可以考虑使用Set交集方法Set#&:
ycl3bljg4#
如果使用Rails,请使用
.overlaps?
。Rails从Rails 3开始就在
Range
上有了一个名为overlaps?
的方法:如果你正在使用Rails或者想看看它的实现,这是非常方便的。
xtfmy6hx5#
你们是不是太为难我了?也许我错过了一些东西,但检查交叉点的简单方法如下。
注意:数组的顺序对结果没有影响。