2

我正在创建一个使用 Entity 对象类的 android 游戏,然后将其扩展为许多不同的类型(即敌人、子弹等)。有没有办法创建一个实体类型的池,然后将获得的实体对象转换为我在运行时需要的任何东西(比如子弹类型)?将实体作为参数传递给构造函数只会破坏池的目的,对吗?下面是一个例子:

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);
    }
}

}

4

2 回答 2

1

对象池的重点通常是避免系统分配和释放开销,并要求您知道要分配的每种实体类型的数量的“最坏情况”限制。因此,假设您的实体在生命周期和使用方面有很大不同,您可能希望为每个实体拥有单独的池。(您绝对可以像@zaske 的回答那样改善游泳池。)

另一方面,如果你真的想要一个单一的Entity池,并且你想在运行时自定义这些实体,你可以从使用实体子类更改为:

class Entity {
   EntityCustomizer custom;
   ...
}

然后,当Entity从池中取出一个时,您传入一个BulletShip任何定制器对象:

public Entity obtain (int objectType) {
  Entity ent = super.obtain();
  if (objectType==SOME_OBJECT_TYPE)
    ent.custom = EntityCustomizer.SOME_OBJECT_TYPE_IMPL;
  return ent;
}

(我很确定这是一个众所周知的模式,我应该使用适当的语言来识别部件......)

总而言之,我认为每种实体类型的单独池是可行的方法,因为我的解决方法非常hacky(你正在交易一堆编译时类型检查以获得一些运行时灵活性)。

于 2012-11-08T19:03:35.477 回答
0

使用您当前的代码,您的池可以存储作为实体或实体子类的任何对象。因此,您只能使用instanceof, 或 downcast 来获取具体对象的类型。

如果您希望每种类型有不同的池,可以考虑将池的声明更改为:

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
于 2012-11-08T18:11:18.450 回答