我想避免并发修改异常。我循环一个实体HashMap来勾选()每个实体。玩家实体在屏幕上移动WASD输入,并且当玩家向右移动时测试addNewEntity()
方法,我打电话GameState.addNewEntity(new Explosion(true, this.x, this.y));
。玩家出现几次爆炸,然后出现错误。 Player类扩展了扩展Entity的Creature。 Explosion扩展了Entity类。试图避免并发修改异常
此代码是从我的游戏状态类:
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);
我打勾()方法:
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。
我是在迭代它的同时修改地图的可能性如何?
谢谢伊兰。像魅力一样工作。 – Fabced