Пул объектов LibGdx для многих объектов одного родительского класса

в моей игре постоянно создаются пули, поэтому я хочу использовать Pool класс для этого. Однако, проблема в том, что у меня есть много типов пуль. Все они расширяют один и тот же родительский класс Projectile. В настоящее время существует 19 типов пуль. Это плохая идея, чтобы создать Pool класс для каждого из них. И еще может прийти позже.

Я пытался бросить BallistaArrow arrow = (BallistaArrow) world.getPool().obtain(); . Однако я получаю исключение cast:

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

BallistaArrow-это ребенок класс снаряда.

есть ли способ решить эту проблему, чтобы у меня был один Pool класс для всех Projectile расширение объектов?

1 ответов


пул содержит экземпляры определенного типа. Скажем, в нем есть 10 объектов, которые будут 10 конкретными Projectile экземпляры, вы не можете решить, какой тип объекта после вы извлекаете его из бассейна.

есть два способа решить эту проблему, по крайней мере:

  1. используйте несколько пулов, по одному на тип пули. Вы можете поместить обертку вокруг пулов, которые знают, какой из них использовать на основе типизированного параметра. Это, вероятно, не так уж плохо решение. Пустой бассейн-не такое уж большое дело. У вас могут возникнуть проблемы с удержанием, если какой-то класс снаряда используется некоторое время, а затем не используется (его пул все равно будет заполнен).
  2. сделать свой Projectile подтипы специализация времени выполнения, а не подкласс. Так что у вас просто есть Projectile класс, который хранит вещи, общие для всех ваших пуль, и выяснить разницу в поведении во время выполнения. См.использование пулов объектов в Libgdx.