Artemis - 如何从世界中删除所有实体

时间:2014-10-01 15:13:11

标签: artemis

我想从世界中删除所有实体。如果为实体注册了标签或组,我也想删除它们。就像根本没有这样的实体。它与World.delete函数非常相似,但您应该遍历所有实体。我找不到办法。并且无法相信设计师没有准备这样的功能来从实体中清除世界。我想念一下吗?

1 个答案:

答案 0 :(得分:2)

没有默认方式从世界中删除所有实体 - 通常通过处置和重新创建世界来完成 - 但通过添加自定义管理器可以轻松实现:

public final class EntityTracker extends Manager {
    private Bag<Entity> entities = new Bag<Entity>();

    @Override
    public void added(Entity e) {
        entities.add(e);
    }

    @Override
    public void deleted(Entity e) {
        entities.remove(e);
    }

    public void deleteAllEntities() {
        for (Entity e : entities)
            e.deleteFromWorld();
    }
}

在最新版本的artemis-odb中,使用AspectSubscriptionManager更容易:

    IntBag entities = world.getAspectSubscriptionManager()
        .get(Aspect.all())
        .getEntities();

    int[] ids = entities.getData();
    for (int i = 0, s = entities.size(); s > i; i++) {
        world.delete(ids[i]);
    }

编辑:上述代码假定为artemis-odb;我不确定vanilla artemis'TagManager和GroupManager是否会在删除时自动删除实体。