在Android中,我使用SurfaceView来显示简单的2D游戏。位于画布上的位图(.png)带有 alpha(表示游戏对象)。
现在我想做一个简单但准确的碰撞检测。检查这些位图是否重叠非常容易。
但是当这些位图有透明区域时,如何检查碰撞?我的挑战是检测两个球是否碰撞。它们在宽度和高度上填充整个位图,但在所有四个边缘中,当然有透明区域,因为它是正方形中的圆形。
只有当球确实碰撞而不是周围的位图框时,检测碰撞的最简单方法是什么?
我是否必须在球的轮廓上尽可能多地存储坐标?或者Android在检查碰撞时能否“忽略”alpha通道?
答案 0 :(得分:11)
我能想到的另一种方法是使用可以使用Path构建的简单对象。
一旦你有两个边界由路径表示的对象,你可以试试这个:
Path path1 = new Path();
path1.addCircle(10, 10, 4, Path.Direction.CW);
Path path2 = new Path();
path2.addCircle(15, 15, 8, Path.Direction.CW);
Region region1 = new Region();
region1.setPath(path1, clip);
Region region2 = new Region();
region2.setPath(path2, clip);
if (!region1.quickReject(region2) && region1.op(region2, Region.Op.INTERSECT)) {
// Collision!
}
将对象作为路径后,可以使用drawPath()直接绘制它们。您还可以通过transform()路径执行移动。
答案 1 :(得分:7)
如果是球碰撞,你可以进行分析碰撞检测 - 它会比每像素检测快得多。你只需要有两个球的中心(x1,y1)和(x2,y2)和半径r1用于第一个球,r2用于第二个球。现在,如果球的中心之间的距离小于或等于半径之和,那么球就会碰撞:
colide = sqrt((x1-x2)^2+(y1-y2)^2)<=r1+r2
但更快一点的方法是比较这个值的平方:
colide = (x1-x2)^2+(y1-y2)^2<=(r1+r2)^2
答案 2 :(得分:2)
使用像AndEngine这样的现有库,而不是重新发明轮子要容易得多。我不确定它是否可以与SurfaceView
一起使用。查看此文章:Pixel Perfect Collision Detection for AndEngine。