处理友好的火灾碰撞检测
Handle friendly fire collision detection
我想创建一个友好的射击机制。本质上,我的立方体会反复发射子弹来击中敌人。我还想检测子弹和另一个立方体(友军火力)之间的命中。为了避免子弹的边界与发射它的立方体重叠,在我的 "Cube" class 中我覆盖了 equals。每个 Cube 都有一个唯一的 id,在创建 Cube 时立即初始化。
问题是我有一个非常严重的错误。当我添加第一个立方体时,所有行为都正常,但是一旦我添加第二个立方体,即使它们没有相互射击,也会立即检测到两个立方体的子弹发生碰撞。即使我添加更多立方体也会发生这种情况。我检查了边界,它们看起来很好。
我放了一些代码:
碰撞检测
// check collisions between bullets and cubes (friendly fire)
for(BaseBullet bullet : bullets) {
for(BaseSquare square : squares) {
// exclude collision between bullet and its own Cube
if (!bullet.getBaseSquare().equals(square)) {
// check if bounds overlap
if (square.getBounds().overlaps(bullet.getBounds())) {
System.out.println("collision between bullet and qube");
// propagate the event to anyone is interested in it
EventsManager.qubeHitByQube(bullet, square);
bullet.remove();
bulletsToDestroy.add(bullet);
}
}
}
}
立方体的equals方法
@Override
public boolean equals(Object o) {
if(!(o instanceof BaseSquare) || o == null) {
return false;
}
BaseSquare baseSquare = (BaseSquare)o;
return baseSquare.getUniqueID().equals(getUniqueID());
}
注意
"friendly fire" 我的意思是当你的物体击中自己而不是敌人时。
我怀疑问题更可能来自 'if (square.getBounds().overlaps(bullet.getBounds()))' 而不是 square 的 equals() 方法。
'BaseBullet' 和 'BaseSquare' 是否扩展了 LibGDX 的 Sprite class?您不应该调用 getBoundingRectangle() 吗?
我想创建一个友好的射击机制。本质上,我的立方体会反复发射子弹来击中敌人。我还想检测子弹和另一个立方体(友军火力)之间的命中。为了避免子弹的边界与发射它的立方体重叠,在我的 "Cube" class 中我覆盖了 equals。每个 Cube 都有一个唯一的 id,在创建 Cube 时立即初始化。
问题是我有一个非常严重的错误。当我添加第一个立方体时,所有行为都正常,但是一旦我添加第二个立方体,即使它们没有相互射击,也会立即检测到两个立方体的子弹发生碰撞。即使我添加更多立方体也会发生这种情况。我检查了边界,它们看起来很好。
我放了一些代码:
碰撞检测
// check collisions between bullets and cubes (friendly fire)
for(BaseBullet bullet : bullets) {
for(BaseSquare square : squares) {
// exclude collision between bullet and its own Cube
if (!bullet.getBaseSquare().equals(square)) {
// check if bounds overlap
if (square.getBounds().overlaps(bullet.getBounds())) {
System.out.println("collision between bullet and qube");
// propagate the event to anyone is interested in it
EventsManager.qubeHitByQube(bullet, square);
bullet.remove();
bulletsToDestroy.add(bullet);
}
}
}
}
立方体的equals方法
@Override
public boolean equals(Object o) {
if(!(o instanceof BaseSquare) || o == null) {
return false;
}
BaseSquare baseSquare = (BaseSquare)o;
return baseSquare.getUniqueID().equals(getUniqueID());
}
注意
"friendly fire" 我的意思是当你的物体击中自己而不是敌人时。
我怀疑问题更可能来自 'if (square.getBounds().overlaps(bullet.getBounds()))' 而不是 square 的 equals() 方法。
'BaseBullet' 和 'BaseSquare' 是否扩展了 LibGDX 的 Sprite class?您不应该调用 getBoundingRectangle() 吗?