我正在使用单线程游戏,在Main类中我有ArrayList来包含用于攻击僵尸的Bullet对象。 每个游戏框架都像我一样循环:
ArrayList<Bullet> bulletList;
for (Bullet iBullet : bulletList) {
iBullet.move();
iBullet.attack(bulletList);
}
在Bullet课程中,我写了
public void attack(ArrayList<Bullet> bulletList) {
for (Zombies z : zombieList) {
if ( hit condition ) {
bulletList.remove(this); //problem here
return;
}
}
}
我在第一次循环后得到null错误,似乎bullet对象已从ArrayList中成功删除,并且还在Main类的循环中造成了一些混乱。
答案 0 :(得分:2)
您可以使用Iterator,更改attack
方法以接受它作为参数:
Iterator<Bullet> iterator = bulletList.iterator();
while (iterator.hasNext()) {
Bullet iBullet = iterator.next();
iBullet.move();
iBullet.attack(bulletList, iterator);
}
public void attack(ArrayList<Bullet> bulletList, Iterator<Bullet> iterator) {
iterator.remove();
}
或者您可以更改attack
方法以返回指示子弹是否命中的布尔值(而不是删除子弹),并使用Java 8中引入的removeIf()
方法:
for (Bullet iBullet : bulletList) {
iBullet.move();
}
bulletList.removeIf(b -> b.attack());