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



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

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位置,但无济于事。有没有一种直观的方法来判断导弹何时"击中"敌方飞行器?

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

更合身。

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

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

最新更新