// 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
的更好方法是什么?
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();
我更喜欢通过
EntityFactory
的第二种方法。
说明:
虽然 EntityFactory 是普通工厂模式的清晰表示,但你的 Gun 看起来像一个 builder 模式,但只有一种创建
Entity
的方法。因此,为每个 Entity
创建使用新实例是没有意义的,因为您在实例中不存储构建状态。您的
Gun
类只是Entity
的包装。但是如果你从 Entity
得到一个 engine.getEntitiesFor(Family...
你不能得到它的 Gun
包装。所以你不能真正将它用于引擎系统中的任何东西。如果您的
EntityFactory
变得太复杂和冗长,我建议将其拆分为GunFactory
、BananaFactory
等。