LibGdx对象池:用于同一父类的多个对象

7
在我的游戏中,子弹不断地被创建,因此我想使用Pool类来实现。但是,问题是我有很多种类型的子弹,它们都继承自同一个父类Projectile。目前有19种子弹类型。为每一种类型创建一个Pool类是一个不好的主意,而且以后可能会有更多的类型。
我尝试着进行转换:BallistaArrow arrow = (BallistaArrow) world.getPool().obtain();。然而,我得到了一个转换异常: [...].mygame.Projectile cannot be cast to [...].mygame.engineer.BallistaArrowBallistaArrowProjectile的子类。
是否有任何方法可以解决这个问题,让我可以为所有继承Projectile的对象使用一个Pool类?
1个回答

3
池中包含特定类型的实例。假设它有10个对象,这些将是10个特定的 Projectile 实例,在从池中提取之后,您不能决定对象的类型。有两种解决方法,至少有:
1.使用多个池,每个子弹类型一个池。您可以在池周围放置一个包装器,根据类型化参数知道要使用哪个池。这可能不是一个糟糕的解决方案。空池并不重要。如果某个类的项目用了一段时间,然后不再使用(其池仍将保持满状态),则可能会出现保留问题。
2.使 Projectile 的子类型成为运行时特化,而不是子类。因此,您只需要一个 Projectile 类来存储所有子弹的公共信息,并在运行时确定行为差异。请参见 在 Libgdx 中使用对象池

1
+1,但第三个选项是制作自己的池实现,可以处理这个问题,但我仍然会选择选项1。 - noone
如果没有比拥有大量池更好的解决方案,那么我会选择选项1。感谢您的澄清。 - draziw
@user2974885 请接受答案,这样它就不会再被列为未回答了。 - noone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接