我正在创建一个使用Entity对象类的Android游戏,然后在许多不同类型(即敌人,子弹等)中进行扩展。有没有办法创建一个Entity类型的池,然后将获得的Entity对象转换为我在运行时需要的任何东西(比如一个项目符号类型)?将实体作为参数传递给构造函数只会破坏池正确的目的吗?一个例子如下:
public class EntityPool extends Pool<Entity> {
public EntityPool (int initialCapacity, int max) {
super(initialCapacity, max);
}
protected PooledEntity newObject () {
return new PooledEntity();
}
public Entity obtain (int objectType) {
Entity ent = super.obtain();
if (objectType==SOME_OBJECT_TYPE)
//Do something to make ent into that object type
return ent;
}
public class PooledEntity extends Entity {
PooledEntity () {
super(null, 0, 0);
}
public void free () {
EntityPool.this.free(this);
}
}
}
答案 0 :(得分:1)
对象池的目的通常是避免系统分配和释放开销,并要求您知道要分配的每种类型实体的数量的“最坏情况”限制。因此,假设您的实体在生命周期和使用方面有很大差异,您可能希望为每个实体分别设置池。 (你可以像@ zaske的回答一样改进游泳池。)
另一方面,如果您真的想要一个Entity
池,并且想要在运行时自定义这些实体,则可以从使用Entity子类更改为:
class Entity {
EntityCustomizer custom;
...
}
然后,当从池中取出Entity
时,您会传入Bullet
或Ship
或任何自定义程序对象:
public Entity obtain (int objectType) {
Entity ent = super.obtain();
if (objectType==SOME_OBJECT_TYPE)
ent.custom = EntityCustomizer.SOME_OBJECT_TYPE_IMPL;
return ent;
}
(我很确定这是一个众所周知的模式,我应该使用适当的语言来识别这些部分......)
所有人都说,我认为每种实体类型的单独池都是可行的方法,因为我的解决方法很糟糕(你正在进行一系列编译时类型检查以获得一些运行时灵活性)。 / p>
答案 1 :(得分:0)
使用当前代码,您的池可以存储任何实体或子类实体的对象。因此,您只能使用instanceof
或向下转换来获取具体对象的类型。
如果您希望每种类型有不同的池,可以考虑将池的声明更改为:
public class EntityPool<T> extends Pool<T extends Entity>
然后例如:
EntityPool<Bullet> bulletsPool = new EntityPool<Bullet>(); //only objects of Bullet of sub classes can be added