【问题标题】:Collision detection android (with asteroids!!)碰撞检测机器人(与小行星!!)
【发布时间】:2013-02-17 07:34:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 圆形的问题在哪里?您可以像collision = distance(c1.center,c2.center) < c1.radius+c2.radius 一样简单地做一些事情。
  • 着陆器是长方形的,小行星是圆形的——很抱歉没有把它说得更清楚。

标签: java android collision-detection bounding-box


【解决方案1】:

如果着陆器矩形是轴对齐的(它的边缘平行于坐标轴),很容易检查与圆的碰撞。给定一个半径为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的公式,这是迄今为止我找到的最简单的一个。

【讨论】:

  • 着陆器本身是可以旋转的,不幸的是轴并不总是平行的。有什么办法可以修改它使其仍然有效?
  • @swiss196 我已经更新了非轴对齐矩形的答案,希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2020-08-16
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2023-04-09
相关资源
最近更新 更多