Более эффективным подходом может быть использование Entity Component System или, по крайней мере, заимствовать дизайн композиции. Это позволяет вам иметь один конкретный класс, например Ability
, который будет содержать общие поля, общие для всех способностей, например. стоимость очков умения, продолжительность способности, типы целей, типы активации и т. д. Затем у вас будет компонент для каждого специального значения, которое нужно добавить, и элемент управления для каждого специального поведения, которое необходимо добавить к этой общей способности. Пример:
Ability ability = new Ability();
ability.addComponent(new DurationComponent(double seconds)); // specify how long effect lasts
ability.addControl(new DamagingControl(int damage, Object targetType, etc.)); // so ability can damage
ability.addControl(new ElementAugmentingControl(Element element, Object weapon/armor, etc.)); // so ability can change status effects/elements
Это должно дать вам представление о композиции. Основываясь на общем поведении ваших способностей, вы должны получить около 10-30 классов, в то время как ваши 400 способностей просто становятся конфигурациями базовой генерической способности. Чтобы дать вам пример, вот RPG с примерно 100 способностями (навыками), которые реализованы как 6 классов. Та же конструкция также может использоваться с любыми игровыми элементами/персонажами.
Что касается создания объекта вы можете сделать:
public static final int ABILITY_ID_SOME_NAME = 1000;
ability.addComponent(new IDComponent(ABILITY_ID_SOME_NAME));
Тогда каждый из ваших способностей может быть частью глобального хранилища данных, где хранятся только способность Прототипы:
Ability ability = DataStore.getByID(ABILITY_ID_SOME_NAME).clone();
В качестве альтернативы, заставьте хранилище данных вернуть уже клонированную способность, чтобы вы не выставляли прототипы.
Наконец, вы можете рассмотреть возможность использования языка сценариев, например. javascript, чтобы изменить поведение родовых способностей. В этом случае все ваши способности будут храниться в папке scripts/abilities/
, которую вы загружаете во время выполнения и только те, которые вам нужны. Некоторые произвольный пример: (heal.js файл)
function onUse(object, healValue) {
if (object.hasComponent(HP_COMPONENT)) {
val hp = object.getComponent(HP_COMPONENT);
hp.value += healValue;
}
}
Вот article, который показывает, как вызывать функции JavaScript в Java.
@PhilipVaughn Можете ли вы пояснить немного больше, что вы имеете в виду? Вы просто спрашиваете о создании объектов, а не о загрузке классов, не так ли?Что вы подразумеваете в комментарии ниже текущего ответа, «динамически загружая * файлы», получая все файлы в папке, а затем перебрасывая их в новый класс »? Вы не можете передать файл в класс (вы можете указать ссылку на объект для класса). Как вы загружаете «файлы» в кеш? –