在 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
的更好方法是什么?
- 选项 1,我创建一个名为
Gun
的新 class
,然后在那里处理组件的创建。
选项 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 pattern,但只有一种创建 Entity
的方法。因此,对于每个 Entity
创建都使用一个新实例是没有意义的,因为您没有在实例中存储构建状态。
您的 Gun
class 只是 Entity
的包装器。但是,如果您从 engine.getEntitiesFor(Family...
获得 Entity
,则无法获得它的 Gun
包装器。所以你不能真正将它用于引擎系统中的任何东西。
如果您的 EntityFactory
变得太复杂和冗长,我建议将其拆分为 GunFactory
、BananaFactory
等等。
// 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
的更好方法是什么?
- 选项 1,我创建一个名为
Gun
的新class
,然后在那里处理组件的创建。 选项 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 pattern,但只有一种创建
Entity
的方法。因此,对于每个Entity
创建都使用一个新实例是没有意义的,因为您没有在实例中存储构建状态。您的
Gun
class 只是Entity
的包装器。但是,如果您从engine.getEntitiesFor(Family...
获得Entity
,则无法获得它的Gun
包装器。所以你不能真正将它用于引擎系统中的任何东西。如果您的
EntityFactory
变得太复杂和冗长,我建议将其拆分为GunFactory
、BananaFactory
等等。