【问题标题】:Dectecting side collisions using rectangles in Java在 Java 中使用矩形检测侧面碰撞
【发布时间】:2013-06-18 17:46:00
【问题描述】:

这是我使用 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;       
    }

【问题讨论】:

标签: java awt collision java-2d


【解决方案1】:

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

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

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);
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多