2015-04-06 88 views
1

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

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

enter image description here

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

你知道一个方法来做这个圆,矩形,三角形和其他基本形状的交集?

求助THX)

+0

看看碰撞检测算法,如AABB和OBB –

回答

4

对于你要落后创建自己的模型了良好的碰撞检测。在这些模型中,您可以指定两个对象所在的条件。

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

您不必描述所有可能的poligons,您可以使用所谓的边界框,这意味着,对于复杂的随机poligon,您可以使用正方形或任何形状最适合它(也可以使用多个形状对于单个对象)。

在您记住这些对象之后,计算它们中的每一个都会与包括它自身在内的所有其他形状混合在一起的条件。

在你的例子中如果正方形的任何角落之间的距离大于圆的半径,球体和正方形就会变成colides。

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

这个问题可能会非常复杂,保持它的简单,如果你想要的东西简单。

+0

我认为你的解决方案是最好的,但它似乎很难找到一个足够通用的算法足够所有类型的形状...我应该改变我的想法和使用像素完美算法的位图。 –

0

要知道2d中的多边形是否与圆形发生碰撞,可以针对其每条线测试最接近圆心(this might help)的线上的点。

然后,检查您发现的点是否在两条形成直线的拐角之间 - 也就是说,该点实际上位于直线上,而不仅仅位于直线上 - 以及该点与圆的中心小于或等于圆的半径。如果两者都适用于多边形的任何一条线,那么您就会发生勾结。您还必须检查多边形边角可能位于的边缘情况,或者触摸该圆。

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

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值

如果您不能直接在代码中使用这种方法,你仍然可以推测它需要实现它在逻辑它会为你工作。它可以检测所有的碰撞,而不会像使用碰撞盒那样使用伪碰撞检测。

祝你好运!如果你有任何问题随时问,我来帮忙!