LibGdx对象池,用于同一父类的许多对象

时间:2013-11-09 21:17:38

标签: java android object libgdx pool

在我的游戏中,不断创建项目符号,因此我想使用Pool类。然而,问题是我有很多类型的子弹。所有这些都扩展了相同的父类Projectile。目前有19种子弹。为每个人创建一个Pool类是个坏主意。还有更多可能会在以后发生。

我试图投射BallistaArrow arrow = (BallistaArrow) world.getPool().obtain();。但是我得到了施放异常:

[..].mygame.Projectile cannot be cast to [...].mygame.engineer.BallistaArrow

BallistaArrow是Projectile的子类。

有没有办法解决这个问题,所以我可以为所有Pool扩展对象设置一个Projectile类?

1 个答案:

答案 0 :(得分:3)

池包含特定类型的实例。假设它有10个对象,那些将是10个特定的Projectile个实例,在从池中提取它之后,你无法确定对象是的类型。

至少有两种方法可以解决这个问题:

  1. 使用多个池,每个项目符号类型一个。您可以根据类型参数在池周围放置一个包装器,知道要使用哪个池。这可能不是解决方案的坏处。空池不是什么大问题。如果某种类型的射弹使用了一段时间,你可能会遇到保留问题,然后就不会使用(它的游泳池仍然是满的)。
  2. 使您的Projectile子类型成为运行时特化,而不是子类。所以你只需要一个Projectile类来存储你所有子弹共有的东西,并找出运行时的行为差异。见Using Object Pools in Libgdx