0

这是我学习 Java 的第一周,我正在制作一个包含矩形相互反弹的游戏。rx 和 ry 是矩形的坐标,velRX 和 velRY 是它们的 x 和 y 速度。我正在尝试使矩形彼此反弹(反向 y 速度),但如果它们在顶部或底部碰撞,则以相同的 x 速度继续,反之亦然。但是,我不知道如何检测矩形碰撞的哪一侧。我可以帮忙吗?相关代码

//Checking for collision between Nemesis and Cop
    public boolean checkCollisionOther() {
        Rectangle r1 = rect1.getBoundsNemesis();
        Rectangle r2 = rect2.getBoundsCop();

        if (r1.intersects(r2)){
            collision = true;
            rect1.velRY = -rect1.velRY;
            rect1.velRX = -rect1.velRX;
            rect2.velRY = -rect2.velRY;
            rect2.velRX = -rect2.velRX;
        }
        else
            collision = false;
        return collision;       
    }
4

1 回答 1

0

您要做的是为两个游戏矩形的每个边缘创建边界矩形。由于矩形有 4 条边,因此矩形有 4 个边界矩形。

警察有 4 个边界矩形,克星有 4 个边界矩形。这意味着您必须intersects在双for循环中进行 16 次测试。

当其中一项intersects测试返回 true 时,您可以确定 cop 矩形的哪个边缘以及您的 nemesis 矩形的哪个边缘发生了碰撞。

这里有一些代码来说明如何创建边界矩形。如果需要,您可以使它们宽于 3 个像素。

public List<BoundingRectangle> createBoundingRectangles(Rectangle r) {
    List<BoundingRectangle> list = new ArrayList<BoundingRectangle>();
    int brWidth = 3;

    // Create left rectangle
    Rectangle left = new Rectangle(r.x, r.y, brWidth, r.height);
    list.add(new BoundingRectangle(left, "left"));

    // Create top rectangle
    Rectangle top = new Rectangle(r.x, r.y, r.width, brWidth);
    list.add(new BoundingRectangle(top, "top"));

    // Create right rectangle
    Rectangle right = new Rectangle(r.x + r.width - brWidth, r.y, brWidth,
            r.height);
    list.add(new BoundingRectangle(right, "right"));

    // Create bottom rectangle
    Rectangle bottom = new Rectangle(r.x, r.y + r.height - brWidth,
            r.width, brWidth);
    list.add(new BoundingRectangle(bottom, "bottom"));

    return list;
}

public class BoundingRectangle {
    private Rectangle rectangle;
    private String position;

    public BoundingRectangle(Rectangle rectangle, String position) {
        this.rectangle = rectangle;
        this.position = position;
    }

    public Rectangle getRectangle() {
        return rectangle;
    }

    public String getPosition() {
        return position;
    }

    public boolean intersects(Rectangle r) {
        return rectangle.intersects(r);
    }

}
于 2013-06-21T15:35:06.513 回答