1

我想从世界中删除所有实体。如果为实体注册了标签或组,我也想删除它们。就像根本没有这样的实体。它很像World.delete函数,但你应该循环所有实体。我找不到办法。并且无法相信设计师没有准备这样的功能来清除世界上的实体。我错过了什么吗?

4

1 回答 1

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 是否会在删除时自动删除实体。

于 2014-10-23T09:16:36.703 回答