我正在创建一个Android java游戏。一种月球登陆型游戏。我希望实施某种障碍,并且已经选择将随机放置在屏幕上的小行星。
但是,我正在努力了解如何对这些进行碰撞检测。我将使用小行星的图像,因此可以轻松地为每个图像使用矩形边界框,但由于小行星是圆形的(或至少我的将是!),当移动到矩形的角落时可以检测到碰撞,这在视觉上不是小行星的一部分。
我猜我需要使用某种边界圈,但不能确定如何用图像设置它?
我猜,如果所有的小行星都是相同的大小,我可以硬编码圆形/多边形边界框的某些点,然后将它们转换为图像的位置 - 所以实际上,多边形是小行星的形状?
关于这样做的最佳方法的任何建议都会很棒。此外,如果有人可以提供一些高级别的碰撞检测伪代码,那将是值得赞赏的:)
答案 0 :(得分:2)
如果着陆器矩形是轴对齐的(其边缘与坐标轴平行),则很容易检查与圆的碰撞。给定一个半径为r
且中心为(cx, cy)
的圆圈和一个原点为(x, y)
的矩形,宽度为w
,高度为h
;如果其中一个是真的,它们会发生碰撞:
(x < cx < x+w)
和(y-r < cy < y+h+r)
(y < cy < y+h)
和(x-r < cx < x+w+r)
(cx, cy)
之间的距离低于r
。正如我在评论中所说,圆圈之间的碰撞更容易,因为你只需要检查中心之间的距离是否低于半径的总和。
对于非轴对齐的矩形,解决方案有点复杂。给定矩形的四个顶点(A,B,C,D);如果满足以下任何条件,则发生碰撞:
(x < cx < x+w)
和(y < cy < y+h)
intersectCircle(A, B, cx, cy, r)
intersectCircle(B, C, cx, cy, r)
intersectCircle(C, D, cx, cy, r)
intersectCircle(D, A, cx, cy, r)
函数intersectCircle
的伪代码是:
intersectCircle(P1, P2, a, b, r):
x1, y1 = P1
x2, y1 = P2
p = abs((x1-x2)*(a-x1)+(y2-y1)*(b-y1))
q = sqrt((x1-x2)^2 + (y1-y2)^2)
return r > p/q
此功能基于this Mathematics' answer的公式,这是迄今为止我发现的最简单的公式。