Java Graphics2D - 检测两个对象之间的碰撞

Java Graphics2D - Detecting collisions between two objects

我正在创建一个试玩游戏,其中一艘航天器向静止的敌方航天器发射导弹。导弹从左向右移动,敌方飞船位于右侧。如果导弹击中敌机,它 "explodes"(从屏幕上消失)。我的问题是什么时候应该执行 explode 方法,因为判断其中一枚导弹的计划是否与敌机的计划一致有点棘手。在我的主程序中,我有以下内容:

private void updateMissiles(){
    ArrayList ms = craft.getMissiles();
    for(int i = 0; i < ms.size(); i++){
        Missile m = (Missile) ms.get(i);
        if(m.getX() == enemcraft.getX() && m.getY() == enemcraft.getY()){
            enemcraft.explode();
        }
        if(m.isVisible()){
            m.move();
        }else{
            ms.remove(i);
        }
    }
}

这不起作用,尤其是因为导弹和敌方航天器的尺寸不同(分别为 8x5 像素和 20x20 像素)。但是,当我将 if(m.getX() == enemcraft.getX() && m.getY() == enemcraft.getY()) 简单地更改为 if(m.getX() == enemcraft.getX()) 时,该程序可以运行,但它会忽略导弹的 y 位置,并且只要导弹到达相同的 x 位置就会使敌机爆炸敌人。

我尝试尝试不同范围的 x 和 y 位置,但无济于事。有没有一种直观的方法来判断导弹何时 "hits" 敌机?

AABB(轴对齐边界框)

你没有给出太多的依据,但是根据位置进行比较并不能解决你的问题。

if(m.getX() == enemcraft.getX() && m.getY() == enemcraft.getY()){

要求导弹和敌人有相同的位置(x,y),屏幕上只有一个点有那个坐标所以很难命中。您有效地使坏人和导弹的宽度和高度分别为 1 像素和 1 像素。

边界框

导弹和敌人都有一个大小(区域),您需要测试这些区域是否命中。想象两个矩形,每个矩形包含导弹和敌人。当这两个矩形重叠时,您可以将其视为碰撞。

因为我不知道导弹和敌人的 x、y 在哪里(左上角或中间或其他),我假设您使用左上角。我也不知道这两个对象是否提供宽度和高度,所以我将对其进行硬编码。 (20,20) 和导弹 (8,5)

private void updateMissiles () {
    ArrayList ms = craft.getMissiles();
    int mLeft = enemyCraft.getX(); // guessing position is an int . Set the correct type when you copy this
    int mTop = enemyCraft.getY();
    int mRight = mLeft + 20;
    int mBottom = mTop + 20;

    for (int i = 0; i < ms.size(); i++) {
        Missile m = (Missile) ms.get(i);
        // only test if both missile and enemyCraft are visible
        // I am guessing that enemyCraft has a isVisible method
        if(m.isVisible() && enemyCraft.isVisible()){
            int mx = m.getX(); // Again I am guessing the type as int
            int my = m.getY();
            if ( ! (my > mBottom || mx > mRight || mx + 8 < mLeft || my + 5 < mTop)) {
                enemyCraft.explode();
                ms.remove(i);  // remove missile
            }
        }
        if (m.isVisible()) {
            m.move();
        }
    }
}

更合身。

这个方法有问题。导弹和​​坏人可能与边界框的形状不同。这将导致碰撞,即使它们实际上并未接触。但这很容易解决。

按照上面的方法进行测试,这会让您知道是否应该进行更多测试。当您发现碰撞时,将两个对象分成几个较小的边界框并测试它们是否重叠。这将提高准确性。