碰撞检测android(带小行星!!)

时间:2013-03-02 23:51:05

标签: java android collision-detection bounding-box

我正在创建一个Android java游戏。一种月球登陆型游戏。我希望实施某种障碍,并且已经选择将随机放置在屏幕上的小行星。

但是,我正在努力了解如何对这些进行碰撞检测。我将使用小行星的图像,因此可以轻松地为每个图像使用矩形边界框,但由于小行星是圆形的(或至少我的将是!),当移动到矩形的角落时可以检测到碰撞,这在视觉上不是小行星的一部分。

我猜我需要使用某种边界圈,但不能确定如何用图像设置它?

我猜,如果所有的小行星都是相同的大小,我可以硬编码圆形/多边形边界框的某些点,然后将它们转换为图像的位置 - 所以实际上,多边形是小行星的形状?

关于这样做的最佳方法的任何建议都会很棒。此外,如果有人可以提供一些高级别的碰撞检测伪代码,那将是值得赞赏的:)

1 个答案:

答案 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的公式,这是迄今为止我发现的最简单的公式。