简单的碰撞检测 - Android

时间:2011-09-30 12:09:08

标签: android collision-detection

我想在乒乓球游戏中进行非常简单的碰撞检测。 球是方形,桨(球棒)是矩形。

我有两个实体进入,我可以获得当前的X和Y位置,以及位图的高度和宽度。这是最简单的方法吗?

我有这段代码:

public void getCollision(Entity enitityOne, Entity enitityTwo){

    double eventCoordX = (enitityOne.getCenterX() - (enitityTwo.getBitmapWidth() / 2));
    double eventCoordY = (enitityOne.getCenterY() - (enitityTwo.getBitmapHeight() / 2));

    double X = Math.abs(enitityTwo.getxPos() - eventCoordX);
    double Y = Math.abs(enitityTwo.getyPos() - eventCoordY);

    if(X <= (enitityTwo.getBitmapWidth()) && Y <= (enitityTwo.getBitmapHeight())){
        enitityOne.collision();
        enitityTwo.collision();
    }
}

但我很瞎,这只适用于桨的中间而不是侧面。 问题是我无法看到代码错误的地方。 任何人? 有人有更好的主意吗?

2 个答案:

答案 0 :(得分:4)

如果你想要的是找到2个给定的矩形是否以某种方式相交(并因此发生碰撞),这里是最简单的检查(C代码;随意使用浮点值):

int RectsIntersect(int AMinX, int AMinY, int AMaxX, int AMaxY,
                   int BMinX, int BMinY, int BMaxX, int BMaxY)
{
    assert(AMinX < AMaxX);
    assert(AMinY < AMaxY);
    assert(BMinX < BMaxX);
    assert(BMinY < BMaxY);

    if ((AMaxX < BMinX) || // A is to the left of B
        (BMaxX < AMinX) || // B is to the left of A
        (AMaxY < BMinY) || // A is above B
        (BMaxY < AMinY))   // B is above A
    {
        return 0; // A and B don't intersect
    }

    return 1; // A and B intersect
}

矩形A和B由其角的最小和最大X和Y坐标定义。

嗯...... This has been asked before

答案 1 :(得分:0)

如果您正在处理矩形,那么

    /**
 * Check if two rectangles collide
 * x_1, y_1, width_1, and height_1 define the boundaries of the first rectangle
 * x_2, y_2, width_2, and height_2 define the boundaries of the second rectangle
 */
boolean rectangle_collision(float x_1, float y_1, float width_1, float height_1, float x_2, float y_2, float width_2, float height_2)
{
  return !(x_1 > x_2+width_2 || x_1+width_1 < x_2 || y_1 > y_2+height_2 || y_1+height_1 < y_2);
}

这是一个很好的例子......