如何检测形状碰撞 - Android

时间:2015-04-06 16:24:10

标签: android collision-detection

我想检测Android游戏在画布(SurfaceView)上动态绘制的形状之间的碰撞。

我可以很容易地使用Rect或RectF对象的交叉方法,但结果不是很好(见下图,我有“假”检测)。

enter image description here

我不想使用Bitmap,因此不可能使用“像素完美”方法。

你知道如何为圆形,矩形,三角形和其他基本形状的交叉点做这个吗?

寻求帮助;)

3 个答案:

答案 0 :(得分:4)

要获得良好的碰撞检测,您必须在后面创建自己的模型。在这些模型中,您可以指定两个对象合并的条件。

例如,圆圈由中心位置和半径描述。正方形由左下角和边长描述。

你不喜欢'必须描述所有可能的poligons,你可以使用所谓的边界框,这意味着,对于复杂的随机poligon,你可以使用正方形或者哪种形状最适合它(你也可以为一个对象使用多个形状)。 / p>

在考虑了这些物体之后,你会计算出每个物体都会与包括其自身在内的所有其他形状相媲美的条件。

在您的示例中,如果方形的任何角之间的距离大于圆的半径,则球体和方形会合并。

在这里,您可以阅读更多http://devmag.org.za/2009/04/13/basic-collision-detection-in-2d-part-1/

这个问题可能变得非常复杂,如果你想要简单的事情,请保持简单。

答案 1 :(得分:0)

要知道2d中的多边形是否与圆相撞,您可以为每条线测试最接近圆心(this might help)的线上的点。

然后,检查您找到的点是否在构成该线的两个角之间 - 也就是说,该点实际上在线上,而不仅仅是在其延续线上 - 以及该点到中心的距离圆的大小小于或等于圆的半径。如果两者都适用于多边形的任何一条线,则会产生勾结。您还必须检查多边形角可能位于的边缘情况,或者触摸圆圈。

对于两个圈子,这更容易。检查中心之间的距离,并将其与半径之和进行比较。如果距离小于或等于总和,则会产生勾结。

答案 2 :(得分:0)

这是我在自己的游戏中用于检测圆形和矩形交叉的直接适用方法。它将球(在这种情况下是一个视图)和矩形(也是一个视图)作为参数检查与球的碰撞。您可以将方法放在Timer中,并设置您希望检查圆和矩形的碰撞间隔。

以下是方法:

public boolean intersects(BallView ball, Rectangle rect) {
        boolean intersects = false;
        if (ball.getX() + ball.getR() >= rect.getTheLeft() &&
            ball.getX() - ball.getR() <= rect.getTheRight() &&
            ball.getY() + ball.getR() <= rect.getTheBottom() &&
            ball.getY() - ball.getR() >= rect.getTheTop())
        {
            intersects = true;
        }

        return intersects;

    }

getR()获得圆的半径

getX()获取圆圈X位置值的中心

getTheLeft()获取矩形的左X值

getTheRight()获取矩形的右X值

getTheTop()获取矩形的前Y值

getTheBottom()获取矩形的底部Y值

如果你不能在你的代码中直接使用这个方法,你仍然可以推测它需要的逻辑来实现它对你有用的地方。它可以检测所有碰撞而不使用伪碰撞检测,就像圆圈的碰撞盒一样。

祝你好运!如果您有任何问题随时可以提问,我可以随时为您提供帮助!