实体组件系统删除实体

时间:2018-04-21 22:57:34

标签: java design-patterns

这是我第一次尝试在我的项目中实现实体组件系统,我不确定它的一些机制是如何工作的。例如,我删除一个实体?由于所有系统都在整个游戏循环中使用实体列表,因此每次删除该列表元素的尝试都会被判定为ConcurrentModificationException。按this建议我试图为实体设置某种“toRemove”标志,并在每次系统迭代列表时查找它

public class DrawingSystem extends System {

    public DrawingSystem(List<Entity> entityList) {
        super(entityList);
    }

    public void update(Batch batch) {
        for (Entity entity : entityList) {
            removeIfNeccesarry(entity);
            //code

            }
        }

        public void removeIfNeccesarry(Entity entity){
            if(entity.toRemove){
                entityList.remove(entity);
            }
        }

    }

但这并没有帮助摆脱异常。我确信这个问题有一个优雅的解决方案,因为这个设计模式被广泛使用,但我只是不知道它。

1 个答案:

答案 0 :(得分:0)

查看迭代器:
“迭代器允许调用者在迭代过程中使用定义明确的语义从基础集合中删除元素。”
https://docs.oracle.com/javase/8/docs/api/index.html?java/util/Iterator.html

SELECT   `IndepYear`,
         COUNT(`IndepYear`) AS `CommonYear` 
FROM     `country`
GROUP BY `IndepYear`
ORDER BY `CommonYear` DESC
LIMIT    1;

您还可以存储实体的索引,以在列表之外的某处删除,然后在更新/渲染之后的额外步骤中删除失效的实体。
这样做的好处是,您在更新的后续步骤中不会错过实体。

编辑:添加了代码。