2

我目前正在创建一个 android java 游戏。一种登月类游戏。我希望实现某种障碍,并选择将随机放置在屏幕上的小行星。

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

我猜我需要使用某种边界圆,但不确定如何使用图像进行设置?

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

任何有关执行此操作的最佳方法的建议都会很棒。此外,如果有人可以编写一些高级碰撞检测伪代码,那将不胜感激:)

4

1 回答 1

2

如果着陆器矩形是轴对齐的(其边缘与坐标轴平行),则很容易检查与圆的碰撞。给定一个具有半径r和中心的圆和一个具有原点、宽度和高度(cx, cy)的矩形;如果满足以下条件之一,它们就会发生碰撞:(x, y)wh

  • (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

这个函数是基于这个数学答案的公式,这是迄今为止我发现的最简单的一个。

于 2013-03-03T02:40:52.477 回答