检查libgdx中2个对象的冲突

时间:2018-01-12 21:54:09

标签: libgdx

我正在用libgdx制作游戏,用子弹射击外星人。我有2 ArrayList个对象,并想检查bulletArrayList中的任何对象是否与alienArrayList中的任何对象发生碰撞。最好的方法是什么?我在考虑contactListener

在屏幕类中,我正在生成如下对象:

public class PlayScreen implements Screen, InputProcessor,ContactListener {

    public ArrayList<Alien> alienArrayList = new ArrayList<Alien>();
    public ArrayList<Bullet> bulletArrayList = new ArrayList<Bullet>();


    public void generateAlien() {
        alien = new Alien();
        alienArrayList.add(alien);
    }

    public void shootBullet(float x, float y) {
        //send x,y moving coordiantes
        bullet = new Bullet(x,y);
        bulletArrayList.add(bullet);
    }
}

在对象类中,我有Rectangle框,我正在这样移动:

public class Alien {

    public Alien() {
        bound = new Rectangle( x, y, alienRegion.getRegionWidth(), alienRegion.getRegionHeight());

    }

    public void update(float delta) {
        bound.y -= speed * delta;
    }

    public void render(SpriteBatch batch, float delta) {
        update(delta);
        elapsedTime += Gdx.graphics.getDeltaTime();
        alienRegion = (TextureRegion) alien.getKeyFrame(elapsedTime, true);
        batch.draw(alienRegion, getBound().x, getBound().y);
    }
}

1 个答案:

答案 0 :(得分:1)

因为您在Rectangle类中使用Alien,我们可以使用名为Intersector的类,它具有静态方法来检查碰撞检测。

for(Alien alien1: alienArrayList) {
        for(Alien alien2 : bulletArrayList) {
            if(Intersector.overlaps(alien1.rect, alien2.rect)) {
                // Collision code
            }
        }
}

首先,我们使用嵌套特殊的循环遍历这两个列表。然后我们将两个Rectangle传递给Intersector.overlaps(rect1, rect2)。这是Intersector类中定义的静态方法,如果矩形重叠,则返回true。

此外,此代码可以直接进入您的render方法。

此代码不是最优化的,因为它会检查2次rects,但是,我会将优化留给您。

我希望这个答案有所帮助,如果您有任何其他问题,请随时在下面发表评论。