[英]Removing an entity and then adding a new one in its place
所以我正在制作一个僵尸模拟游戏。 我所拥有的是一群随机出现的玩家和僵尸。 当幸存者与僵尸相撞时,我希望它删除幸存者,然后用僵尸代替它,从本质上将他变成僵尸。
碰撞检测效果很好(我只是将awt矩形与intersect方法一起使用)。 但是我有一个僵尸数组列表和一个幸存者数组列表。 发生碰撞时,我会将僵尸添加到僵尸列表中。 然后,我从该列表中删除幸存者。 它可以工作几次,然后随机将索引抛出异常。
java.lang.IndexOutOfBoundsException: Index: 13, Size: 13
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at com.caveragestudios.zombiesim.World.update(World.java:53)
at com.caveragestudios.zombiesim.Main.update(Main.java:93)
at com.caveragestudios.zombiesim.Main.run(Main.java:69)
at java.lang.Thread.run(Unknown Source)
我尝试过使用高级的for循环,常规的for循环和带有while循环的迭代器。 似乎没有任何作用。 这是我目前的代码。
for (int i = 0; i < survivors.size(); i++) {
Survivor s = survivors.get(i);
for (int ii = 0; ii < zombies.size(); ii++) {
Zombie z = zombies.get(ii);
if (z.bounds.intersects(s.bounds)) {
zombies.add(new Zombie(s.position, this));
survivors.remove(i);
}
}
}
其他所有内容似乎都正常运行,只是当我尝试修改列表时,它有点混乱,并抛出索引超出范围的异常。 有任何想法吗?
您已使用外部列表survivors
索引i
到内部列表zombies
。 您的索引变量在zombies.get(i)
是错误的。
for (int i = 0; i < survivors.size(); i++) {
Survivor s = survivors.get(i);
for (int ii = 0; ii < zombies.size(); ii++) {
Zombie z = zombies.get(ii);// Here use ii instead of i
//..............
}
}
要从集合中删除元素,请使用Iterator.remove
。 如下更改代码,以安全地从集合中删除。
Iterator<Survivor > survIt=survivors.iterator();
Iterator<Zombie> zombIt=zombies.iterator();
while(survIt.hasNext()){
Survivor s=survIt.next();
while(zombIt.hasNext()){
Zombie z=zombIt.next();
if (z.bounds.intersects(s.bounds)) {
zombies.add(new Zombie(s.position, this));
survIt.remove(); //Use Iterator.remove.
}
}
}
好吧,我已经设法自己解决了。 从Masud向正确的方向推进。 问题是,在遍历列表时无法修改列表,但是我仍然需要迭代器中的数据。
我要做的是创建两个新列表,一个名为toRemove的列表由碰撞幸存者填充。 然后一个叫toAdd的对象被碰撞的僵尸填充。
然后像往常一样进行遍历,但是没有直接从主列表中添加和删除,而是将它们添加到了这些新列表中。 然后,在完成迭代之后,删除并相应地添加这些新列表。 这是最终代码。
List<Survivor> toRemove = new ArrayList<Survivor>();
List<Zombie> toAdd = new ArrayList<Zombie>();
Iterator<Survivor> survIt = survivors.iterator();
Iterator<Zombie> zombIt = zombies.iterator();
while (survIt.hasNext()) {
Survivor s = survIt.next();
while (zombIt.hasNext()) {
Zombie z = zombIt.next();
if (z.bounds.intersects(s.bounds)){
toAdd.add(new Zombie(s.position, this));
toRemove.add(s);
System.out.println("collided");
}
}
}
for (Survivor s : toRemove) {
survivors.remove(s);
}
for (Zombie z : toAdd) {
zombies.add(z);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.