我正在用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);
}
}
答案 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,但是,我会将优化留给您。
我希望这个答案有所帮助,如果您有任何其他问题,请随时在下面发表评论。