游戏的每一次迭代我希望它减少1 0
因此,我有一个存储关于宇宙的不同对象(行星,彗星,星等)的数组列表。而不是这样做:游戏的每一次迭代我希望它减少1 0
planet.decreaseLifeTime(1);
star.decreaseLifeTime(1);
comet.decreaseLifeTime(1);
游戏的每一次迭代,我希望它由1减少生活时间,我试过,但它不工作:
private ArrayList<SpaceObject> universeEntities;
public void reduceLifeTime() {
for (SpaceObject entity: universeEntities) {
entity.decreaseLifeTime(1);
if(entity.getLifeTime() <= 0) {
erase(entity);
System.out.println("This entity has been erased");
}
System.out.println("life time: " + entity.getLifeTime());
}
}
对象添加像这样:
planet = new Planet(500, 500, -2, -2, 25, Color.BLUE, this);
universeEntities.add(planet);
如果erase(entity)
正在修改universeEntities列表,java将会发疯。
您可以将要擦除的SpaceObject存储在单独的列表中,然后在for循环之后将其擦除。
或
你也可以遍历该universeEntities而不使用迭代 例如一个数字索引
这是我开始编程时犯的一个错误,我仍然偶尔忘记删除项目会扰乱迭代周期。但是请详细说明他正在进行擦除的方式有什么问题,以及Java究竟是如何“疯狂”的。 –
根据Java API文档[API 2014],如果在迭代过程中修改了基础集合,则未指定迭代器的行为。 – leumas95
删除迭代器当前指向的条目时,这一点尤为重要。几乎每个iterable的实现都会遇到问题。 –
根据你实施的reduceLifeTime
方法,问题可能在于调用erase
方法(取决于它是如何实现的)。
如果erase
方法只是试图通过调用ArrayList的remove方法从universeEntities
集合中删除一个项目,它只是破坏一个迭代器。
考虑重新实现你的方法:
public void reduceLifeTime() {
Iterator<SpaceObject> iterator = universeEntities.iterator();
while (iterator.hasNext()) {
SpaceObject object = iterator.next();
object.decreaseLifeTime(1);
if(object.getLifeTime() <= 0) {
iterator.remove();
System.out.println("This entity has been erased.");
}
System.out.println(String.format("Life time: %d", object.getLifeTime()));
}
}
完全工作示例:
public class Test {
private ArrayList<SpaceObject> universeEntities = new ArrayList<SpaceObject>();
public Test() {
universeEntities.add(new Planet());
universeEntities.add(new Planet());
}
public void reduceLifeTime() {
Iterator<SpaceObject> iterator = universeEntities.iterator();
while (iterator.hasNext()) {
SpaceObject object = iterator.next();
object.decreaseLifeTime(1);
if(object.getLifeTime() <= 0) {
iterator.remove();
System.out.println("This entity has been erased.");
}
System.out.println(String.format("Life time: %d", object.getLifeTime()));
}
}
public static void main(String[] args) {
Test test = new Test();
while(true) {
test.reduceLifeTime();
// Endless loop. Need a quit condition.
}
}
public static class SpaceObject {
protected int life = 0;
public SpaceObject(int life) {
this.life = life;
}
public void decreaseLifeTime(int value) {
this.life -= value;
}
public int getLifeTime() {
return life;
}
}
public static class Planet extends SpaceObject {
public Planet() {
super(10);
}
}
}
如果你不想使用迭代器,你可以收集应该被删除的项目在某种收集中,从reduceLifeTime
方法返回,然后使用removeAll
删除。
你的问题是什么? – epoch
行'擦除(实体)'是否更改'universeEntities'列表? –
它只减去1,即生命期(这是一个整数)一次。然而,我希望它不断减去1,直到达到0. – COLONELXO