在Android上的SurfaceView画布上使用位图进行碰撞检测

caw*_*caw 2 android 2d collision-detection

在Android中,我使用SurfaceView来显示简单的2D游戏.带有 alpha(表示游戏对象)的位图(.png)在画布上绘制.

现在我想做一个简单但准确的碰撞检测.检查这些位图是否重叠非常容易.

但是,当这些位图具有透明区域时,如何检查碰撞?我的挑战是检测两个球是否碰撞.它们在宽度和高度上填充整个位图,但在所有四个边缘中,当然都有透明区域,因为它是正方形中的圆形.

只有当球真正碰撞而不是周围的位图框时,检测碰撞的最简单方法是什么?

我是否必须在球的轮廓上尽可能多地存储坐标?或者Android在检查碰撞时能否"忽略"alpha通道?

Dhe*_*.S. 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!
}
Run Code Online (Sandbox Code Playgroud)

将对象作为路径后,可以使用drawPath()直接绘制它们.您还可以通过transform()路径执行移动.

  • 根据我的理解,上面代码中的变量"clip"应该是路径的边界框.出于一般目的,我使用Region clip = new Region(0,0,layoutWidth,layoutHeight); 布局宽度和高度可以是画布或活动的大小或其他. (2认同)

the*_*res 7

如果是球碰撞,你可以进行分析碰撞检测 - 它会比每像素检测快得多.你只需要有两个球的中心(x1,y1)和(x2,y2)和半径r1用于第一个球,r2用于第二个球.现在,如果球的中心之间的距离小于或等于半径的总和,那么球就会碰撞:

    colide = sqrt((x1-x2)^2+(y1-y2)^2)<=r1+r2
Run Code Online (Sandbox Code Playgroud)

但更快一点的方法是比较这个值的平方:

   colide =  (x1-x2)^2+(y1-y2)^2<=(r1+r2)^2
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!对于球示例,这可能是完美的解决方案。我应该提到我希望有一个更通用的解决方案(例如每像素检测),但这是我的错。 (2认同)