7

在我的游戏中不断创建子弹,因此我想为此使用Pool类。但是,问题是我有很多类型的子弹。它们都扩展同一个父类Projectile。目前有19种子弹。为每个人创建一个Pool类是个坏主意。以后可能还会有更多。

我试着投BallistaArrow arrow = (BallistaArrow) world.getPool().obtain();。但是我遇到了演员异常:

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

BallistaArrow 是 Projectile 的子类。

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

4

1 回答 1

3

该池包含特定类型的实例。假设它有 10 个对象,它们将是 10 个特定实例,从池中提取对象Projectile,您无法确定该对象是哪种类型。

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

  1. 使用多个池,每种子弹类型一个。您可以在池周围放置一个包装器,该包装器根据类型化参数知道要使用哪个池。这可能不是一个糟糕的解决方案。空池没什么大不了的。如果某种类型的弹丸使用了一段时间然后没有使用(它的池仍然是满的),您可能会遇到保留问题。
  2. 使您的Projectile子类型成为运行时特化,而不是子类。所以你只有一个Projectile类来存储所有子弹共有的东西,并在运行时找出行为差异。请参阅在 Libgdx 中使用对象池
于 2013-11-10T04:57:36.263 回答