Java Rect.intersects()有时不工作

时间:2014-03-17 23:19:37

标签: java collision rectangles

我现在遍历所有精灵,检查它们是否相互交叉:

for (Sprite s : sprites) {
        if (s.dead) {
            dead.add(s);
        }
        for (Sprite sprite : sprites) {
            if (!sprite.equals(s)) {
                s.collide(sprite, maxX, maxY);
            }
        }
        s.run();

}

并使用Rect.intersects()方法检查sprite,如下所示:

if (getRect().intersects(s.getRect()))

但有时它完全忽略了碰撞,而物体只是相互穿过。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您应该尝试将代码更改为

if(getRect().intersects(s.getRect()) || s.getRect().intersects(getRect()))
{
    // They have intersected
}

原因是,交叉方法检查对于每个矩形是唯一的。执行交叉检查以查看矩形是否与矩形b相交不同于执行交叉检查以查看矩形b是否与矩形a相交。

除此之外,您能否提供有关矩形的更多信息?他们在旋转吗?他们移动的速度有多快?它们有多大?其他信息也将充分使用,我可以尝试考虑其他原因,以便它们不会发生碰撞。

答案 1 :(得分:0)

我通过使它为它所覆盖的区域创建一个矩形来修复它,如下所示:

private void checkForNextCollision() {
    double boundsWidth = width + dX ;
    if(dX < 0){
        boundsWidth= width - dX ;
    }

    double boundsHeight = height + dY ;
    if(dY < 0){
        boundsHeight = height - dY ;
    }
    double boundx = xWorld + dX ;
    double boundy = yWorld + dY ;
    betweenRect = new Rectangle((int)(boundx),(int)(boundy),(int)(boundsWidth), (int)(boundsHeight));


}

然后根据在其他精灵中创建的矩形检查此矩形,以检查下一帧中是否应该发生碰撞:

    public void collide(Sprite s, int maxX, int maxY) {
    maxWX = maxX;
    maxWY = maxY;


    //check for collision with borders
    if (xWorld <= 0) {
        dX = -dX;
        xWorld += 2;
        if(xWorld < -1000){
            dX = 0;
            xWorld += 10;
        }
    }
    if (yWorld <= 0) {
        dY = -dY;
        yWorld += 2;
        if(yWorld < -1000){
            dX = 0;
            yWorld += 10;
        }
    }
    if (xWorld + width >= maxX) {
        dX = -dX;
        xWorld -= 2;
        if(xWorld+width > maxX + 1000){
            dX = 0;
            xWorld -= 10;
        }
    }
    if (yWorld + height >= maxY) {
        dY = -dY;
        yWorld -= 2;
        if(yWorld+height > maxY + 1000){
            dY = 0;
            yWorld -= 10;
        }
    }



    //check for collision with borders
    if(betweenRect.intersects(s.betweenRect)){
        willIntersect = true;
    }else{
        willIntersect = false;
    }

    // Use all checks to see if they should collide
    if (getRect().intersects(s.getRect()) || s.getRect().intersects(getRect()) || willIntersect || (xWorld + width > s.xWorld && xWorld < s.xWorld + s.width && yWorld < s.yWorld+s.height && yWorld + height > s.yWorld) ) {

            double lastDy = dY;
            double lastsDy = s.dY;
            double lastDx = dX;
            double lastsDx = s.dX;

            dY = (((weight - s.weight) / (weight + s.weight)) * lastDy)
                    + (((2.0 * s.weight) / (weight + s.weight)) * lastsDy);
            s.dY = (((s.weight - weight) / (weight + s.weight)) * lastsDy)
                    + (((2.0 * weight) / (weight + s.weight)) * lastDy);

            dX = (((weight - s.weight) / (weight + s.weight)) * lastDx)
                    + (((2.0 * s.weight) / (weight + s.weight)) * lastsDx);
            s.dX = (((s.weight - weight) / (weight + s.weight)) * lastsDx)
                    + (((2.0 * weight) / (weight + s.weight)) * lastDx);



            if(willIntersect){
                willIntersect = false;
                //s.willIntersect = false;
            }


        }




}