Android上旋转位图的碰撞检测

时间:2012-07-13 17:51:41

标签: android detection pixel-perfect

我的Android游戏需要像素完美的碰撞检测。我写了一些代码来检测与“正常”位图的碰撞(未旋转);工作良好。但是,我没有得到旋转位图。不幸的是,Java没有旋转矩形的类,所以我自己实现了一个。它保持四个角相对于屏幕的位置,并描述其位图的确切位置/层;称为“itemSurface”。我解决检测的计划是:

  1. 检测不同itemSurfaces的交集
  2. 计算重叠区域
  3. 相对于其上级itemSurface / bitmap
  4. 设置这些区域
  5. 将每个单个像素与另一个位图的对应像素进行比较
  6. 好吧,我遇到了第一个和第二个问题。有人有想法或得到一些代码吗?也许Java / Android库中已有代码,我只是没找到它。

1 个答案:

答案 0 :(得分:0)

据我所知,您希望在矩形之间进行碰撞检测(以不同方式旋转)。您无需计算重叠区域。而且,比较每个像素都是无效的。

实现一个static boolean isCollision函数,该函数将告诉您一个矩形与另一个矩形之间是否存在冲突。在你拿一张纸之前,先做几何几何来找出确切的公式。出于性能原因,不要在一些Rectangle类中包装一个矩形,只需使用像双精度等原始类型。

然后(伪代码):

for (every rectangle a)
  for (every rectangle b)
    if (a != b && isCollision(a, b))
      bounce(a, b)  

这是O(n ^ 2),其中n是矩形的数量。如果您需要更高的性能,有更好的算法。 bounce函数改变移动矩形的向量,以便模仿碰撞。如果物体的重量相同(你可以将重量与矩形的大小相近),你只需要交换两个速度矢量。

要正确弹跳元素,您可能需要存储辅助表boolean alreadyBounced[][]以确定哪些矩形在弹跳(碰撞)后不需要更改其向量,因为它们已经被弹回。

还有一个提示:

如果您在Android下制作游戏,则必须注意在游戏过程中不要分配内存,因为它会更快地调用GC,这会花费很长时间并减慢游戏速度。我建议您观看this视频和相关内容。祝你好运。