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();
}
}
}
更合身。
这个方法有问题。导弹和坏人可能与边界框的形状不同。这将导致碰撞,即使它们实际上并未接触。但这很容易解决。
按照上面的方法进行测试,这会让您知道是否应该进行更多测试。当您发现碰撞时,将两个对象分成几个较小的边界框并测试它们是否重叠。这将提高准确性。
我正在创建一个试玩游戏,其中一艘航天器向静止的敌方航天器发射导弹。导弹从左向右移动,敌方飞船位于右侧。如果导弹击中敌机,它 "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();
}
}
}
更合身。
这个方法有问题。导弹和坏人可能与边界框的形状不同。这将导致碰撞,即使它们实际上并未接触。但这很容易解决。
按照上面的方法进行测试,这会让您知道是否应该进行更多测试。当您发现碰撞时,将两个对象分成几个较小的边界框并测试它们是否重叠。这将提高准确性。