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

问题描述 投票:0回答:1
// 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;
}

问题

Entity
制作
PooledEngine
的更好方法是什么?

  • 选项 1,我创建一个名为
    class
    的新
    Gun
    ,然后在那里处理组件的创建。
  • 选项2,在

    EntityFactory
    里面
    class
    添加新方法
    createGun()

    class EntityFactory {
     // constructor 
     public void build() {
        // Option 1
        Gun gun = new Gun(engine.createEntity());
        // where I can call gun.fire(), gun.reload(), gun.dispose, and so on..
        engine.addEntity(gun.getEntity());
    
    
        // Option 2
        Entity gun = createGun();
        engine.addEntity(gun);
     }
    
     public Entity createGun() {
        Entity gun = engine.createEntity();
        // components creation here
        ...
        engine.addEntity(gun);
        return gun;
     }
    }
    
    EntityFactory factory = new EntityFactory(world, engine);
    factory.build();
    
java libgdx entity-component-system
1个回答
1
投票

我更喜欢通过

EntityFactory
的第二种方法。

说明:

  • 虽然 EntityFactory 是普通工厂模式的清晰表示,但你的 Gun 看起来像一个 builder 模式,但只有一种创建

    Entity
    的方法。因此,为每个
    Entity
    创建使用新实例是没有意义的,因为您在实例中不存储构建状态。

  • 您的

    Gun
    类只是
    Entity
    的包装。但是如果你从
    Entity
    得到一个
    engine.getEntitiesFor(Family...
    你不能得到它的
    Gun
    包装。所以你不能真正将它用于引擎系统中的任何东西。

  • 如果您的

    EntityFactory
    变得太复杂和冗长,我建议将其拆分为
    GunFactory
    BananaFactory
    等。

© www.soinside.com 2019 - 2024. All rights reserved.