Java Graphics2D - 检测两个对象之间的冲突

时间:2017-04-04 19:19:09

标签: java graphics graphics2d

我正在创建一个试验游戏,其中太空船向一个静止的敌人太空船发射导弹。导弹从左向右移动,敌人的宇宙飞船位于右侧。如果导弹击中敌人的飞行器,它会“爆炸”(从屏幕上消失)。我的问题是我什么时候应该执行爆炸方法,因为要判断其中一个导弹的情节是否与敌方飞船的情节一致是有点棘手的。在我的主程序中,我有以下内容:

richTextBox1.BeginInvoke(new Action(()=>
{
// make changes to control here.
}));

这不起作用,特别是因为导弹和敌方航天器具有不同的尺寸(分别为8x5像素和20x20像素)。但是,当我将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); } } } 更改为if(m.getX() == enemcraft.getX() && m.getY() == enemcraft.getY())时,该程序可以正常工作,但它会忽略导弹的y位置,并且只要导弹到达相同的x位置,就会使敌人的工艺爆炸。敌人。

我尝试过尝试不同范围的x和y位置,但无济于事。是否有一种直观的方式来判断导弹何时“撞击”敌人的飞船?

1 个答案:

答案 0 :(得分:1)

AABB(轴对齐边界框)

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

该行

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

要求导弹和敌人具有相同的位置(x,y),屏幕上只有一个点具有该坐标,因此很难被击中。你已经有效地使你的坏人和导弹有一个像素宽度和一个像素高度。

包围框

导弹和敌人都有一个尺寸(面积)你需要测试这些区域是否会被击中。想象一下两个长方形,每个长方形包含导弹和敌人。当这两个矩形重叠时,您可以将其视为碰撞。

由于我不知道导弹和敌人的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();
        }
    }
}

更合适。

此方法存在问题。导弹和​​坏人的形状可能与边界框的形状不同。即使它们实际上没有碰到,也会导致碰撞。但这很容易解决。

如上所述进行测试,这将告诉您是否应该进行更多测试。当您发现碰撞时,将两个对象分成几个较小的边界框并测试它们是否重叠。这将提高准确性。