在 libgdx ashley ecs 框架池引擎中创建实体的正确方法是什么?

What is the proper way of creating an entity in libgdx ashley ecs framework pooled engine?

// GameWorld
PooledEngine engine = new PooledEngine();

// Gun class
class Gun {
   publc Gun(Entity entity) {
        createComponents();
        addComponents();
   }

   public Entity getEntity();
}

// Option 1
Gun gun = new Gun(engine.createEntity());
engine.addEntity(gun.getEntity());

// Option 2 or a simple method inside EntityFactory class
public Entity createGun() {
    Entity gun = engine.createEntity();
    // components creation here
    ..
    engine.addEntity(gun);
    return gun;
}

问题PooledEngine创建Entity的更好方法是什么?

我更喜欢通过 EntityFactory 的第二种方法。

解释:

  • 虽然 EntityFactory 是常见工厂模式的干净表示,但你的 Gun 看起来像 builder pattern,但只有一种创建 Entity 的方法。因此,对于每个 Entity 创建都使用一个新实例是没有意义的,因为您没有在实例中存储构建状态。

  • 您的 Gun class 只是 Entity 的包装器。但是,如果您从 engine.getEntitiesFor(Family... 获得 Entity,则无法获得它的 Gun 包装器。所以你不能真正将它用于引擎系统中的任何东西。

  • 如果您的 EntityFactory 变得太复杂和冗长,我建议将其拆分为 GunFactoryBananaFactory 等等。