【发布时间】:2016-07-14 05:57:37
【问题描述】:
我正在尝试避免并发修改异常。我遍历一个实体 HashMap 以 tick() 每个实体。玩家实体使用 WASD 输入在屏幕上移动,并在玩家向右移动时测试 addNewEntity() 方法我调用 GameState.addNewEntity(new Explosion(true, this.x, this.y));。播放器上出现几次爆炸,然后出现错误。玩家类扩展了扩展实体的生物。 Explosion 扩展了 Entity 类。
这段代码来自我的 GameState 类:
private static HashMap<Integer, Entity> entities = new HashMap<Integer, Entity>();
private static HashMap<Integer, Entity> newEntities = new HashMap<Integer, Entity>();
player = new Player(game, true, 100, 100);
entities.put(0, player);
我的 tick() 方法:
public void tick() {
// add new elements from newEntities to entities, deleting from newEntities
for (Entry<Integer, Entity> entry : newEntities.entrySet()) {
entities.put(entities.size(), entry.getValue());
newEntities.remove(entry.getValue());
}
System.out.println(entities.size());
// tick the updated entities HashMap
for (Entry<Integer, Entity> entry : entities.entrySet()) {
entry.getValue().tick();
// remove dead entities
if (!entry.getValue().isAlive) {
entities.remove(entry.getKey());
}
}
}
我的 addNewEntity 方法:
public static void addNewEntity(Entity e) {
// add a new element to newEntities.
newEntities.put(newEntities.size(), e);
}
我的渲染方法:
public void render(Graphics g) {
for (Entry<Integer, Entity> entry : entities.entrySet()) {
entry.getValue().render(g);
}
}
我试图通过添加到 newEntities HashMap 而不是添加到实体 HashMap 来避免并发修改异常。在我的 tick 方法中,我循环遍历 newEntities HashMap 并将其中存在的每个项目添加到实体中,依次删除每个项目。只有在那之后,我才会遍历实体 HashMap。
我怎么可能在迭代时修改地图?
【问题讨论】: