如何检测形状碰撞 - Android
How to detect shape collision - Android
我想检测在 Android 游戏的 canvas (SurfaceView) 上动态绘制的形状之间的碰撞。
我可以很容易地使用 Rect 或 RectF 对象的相交方法,但结果不是很好(见下图,我有一个 "false" 检测)。
我不想用Bitmap所以无法使用"pixel perfect"方法
你知道圆形、矩形、三角形和其他基本形状相交的方法吗?
谢谢帮助;)
为了进行良好的碰撞检测,您必须在后面创建自己的模型。在这些模型中,您指定两个对象碰撞的条件。
例如,圆是由中心位置和半径描述的。正方形由左下角和边长描述。
您不必描述所有可能的多边形,您可以使用所谓的边界框,这意味着对于复杂的随机多边形,您可以使用正方形或任何最适合的形状(也可以使用多个单个对象的形状)。
在你记住这些物体之后,你计算出它们中的每一个都会与包括它自身在内的所有其他形状发生碰撞的条件。
在您的示例中,如果正方形的任意角之间的距离大于圆的半径,则球体和正方形发生碰撞。
在这里你可以阅读更多http://devmag.org.za/2009/04/13/basic-collision-detection-in-2d-part-1/
这个问题可能会变得非常复杂,如果您想要简单的东西,请保持简单。
要知道 2d 中的多边形是否与圆碰撞,您可以测试它的每条线,距离圆心最近的点在哪里(this might help ).
然后,检查您找到的点是否在构成直线的两个角之间 - 也就是说,该点实际上在直线上,而不仅仅是在其延续线上 - 以及该点到圆心小于或等于圆的半径。如果对于多边形的任何一条线,两者都成立,则您有共谋。您还必须检查多边形角可能位于或接触圆的边缘情况。
对于两个圈子,这更容易。检查中心之间的距离,并将其与它们的半径之和进行比较。如果距离小于或等于总和,则存在合谋。
这是我在自己的游戏中使用的一种直接适用的方法来检测圆形和矩形的交点。它以球(在本例中是一个视图)和要检查与球碰撞的矩形(也是一个视图)作为参数。您可以将方法放在 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值
如果您不能在代码中直接使用此方法,您仍然可以推测在适合您的地方实现它所需的逻辑。它检测所有碰撞,而不使用伪碰撞检测,如圆的碰撞框。
祝你好运!如果您有任何问题,请随时提出,我随时为您提供帮助!
我想检测在 Android 游戏的 canvas (SurfaceView) 上动态绘制的形状之间的碰撞。
我可以很容易地使用 Rect 或 RectF 对象的相交方法,但结果不是很好(见下图,我有一个 "false" 检测)。
我不想用Bitmap所以无法使用"pixel perfect"方法
你知道圆形、矩形、三角形和其他基本形状相交的方法吗?
谢谢帮助;)
为了进行良好的碰撞检测,您必须在后面创建自己的模型。在这些模型中,您指定两个对象碰撞的条件。
例如,圆是由中心位置和半径描述的。正方形由左下角和边长描述。
您不必描述所有可能的多边形,您可以使用所谓的边界框,这意味着对于复杂的随机多边形,您可以使用正方形或任何最适合的形状(也可以使用多个单个对象的形状)。
在你记住这些物体之后,你计算出它们中的每一个都会与包括它自身在内的所有其他形状发生碰撞的条件。
在您的示例中,如果正方形的任意角之间的距离大于圆的半径,则球体和正方形发生碰撞。
在这里你可以阅读更多http://devmag.org.za/2009/04/13/basic-collision-detection-in-2d-part-1/
这个问题可能会变得非常复杂,如果您想要简单的东西,请保持简单。
要知道 2d 中的多边形是否与圆碰撞,您可以测试它的每条线,距离圆心最近的点在哪里(this might help ).
然后,检查您找到的点是否在构成直线的两个角之间 - 也就是说,该点实际上在直线上,而不仅仅是在其延续线上 - 以及该点到圆心小于或等于圆的半径。如果对于多边形的任何一条线,两者都成立,则您有共谋。您还必须检查多边形角可能位于或接触圆的边缘情况。
对于两个圈子,这更容易。检查中心之间的距离,并将其与它们的半径之和进行比较。如果距离小于或等于总和,则存在合谋。
这是我在自己的游戏中使用的一种直接适用的方法来检测圆形和矩形的交点。它以球(在本例中是一个视图)和要检查与球碰撞的矩形(也是一个视图)作为参数。您可以将方法放在 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值
如果您不能在代码中直接使用此方法,您仍然可以推测在适合您的地方实现它所需的逻辑。它检测所有碰撞,而不使用伪碰撞检测,如圆的碰撞框。
祝你好运!如果您有任何问题,请随时提出,我随时为您提供帮助!