我正在制作 2D,目前正在研究用子弹射击。子弹是一个单独的类。所有项目符号都存储在称为项目符号的数组列表中。当它超出屏幕一侧(
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
at java.util.AbstractList$Itr.next(Unknown Source)
at GameCanvas.updateMovement(GameCanvas.java:94)
at GameCanvas.gameLoop(GameCanvas.java:63)
at GameCanvas.<init>(GameCanvas.java:28)
at GameClient.<init>(GameClient.java:68)
at GameClient.main(GameClient.java:29)
我认为它与被销毁时有关,我使用以下代码来销毁它:
public void move() {
if(x > -16) {
x -= move_speed;
} else {
kill();
}
}
public void kill() {
ObjectHandler.bullets.remove(this);
}
updateMovement() 方法:
public void updateMovement() {
PlayerObject.update();
for(Bullet bullet : ObjectHandler.bullets) {
bullet.move();
}
}
它为什么要这样做?谢谢。
发生这种情况是因为您在迭代列表时修改了列表。
尝试“记住”你需要的东西kill
当你完成整个列表后,检查你的“记忆”并执行适当的操作kill
s。这样,您将在迭代列表后对其进行修改。
E.g.:
public void move() {
if(x > -16) {
x -= move_speed;
} else {
ObjectHandler.remember_to_kill(this);
}
}
// in ObjectHandler:
private HashSet<type_of_object_to_kill> kill_memory = new...;
public void remember_to_kill() {
this.kill_memory.add(this);
}
private void kill_from_memory() {
for (type_of_object_to_kill obj: kill_memory) {
ObjectHandler.bullets.remove(this);
}
ObjectHandler.kill_memory.clear();
}
// update movement:
public void updateMovement() {
PlayerObject.update();
for(Bullet bullet : ObjectHandler.bullets) {
bullet.move();
}
ObjectHandler.kill_from_memory();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)