2016-09-24 4 views
1

Я создаю RPG с JavaFX и вам нужно получить совет от экспертов.Java Game Design Class Загрузка

Каков правильный способ загрузки определенных ресурсов? Я не говорю о изображениях и звуке, эта часть проста. Я говорю о занятиях. Например; У меня есть некоторые необычные способности 400+, которые вы можете активировать. У меня есть отдельный класс для каждой способности (или arte, как я их называю). Чтобы получить доступ к этой возможности, я хочу позвонить по телефону

Data.getArte(idOfArte); 

и это должно вернуть объект типа Arte. Все артесы имеют файл класса separte.

Есть и другие ресурсы, которые так же похожи, как Герои, Враги и т. Д. Каким будет лучший способ загрузить и назвать эти ресурсы для использования? Есть ли лучший способ сделать это?

Редактировать: Я также очень заинтересован в производительности.

+0

@PhilipVaughn Можете ли вы пояснить немного больше, что вы имеете в виду? Вы просто спрашиваете о создании объектов, а не о загрузке классов, не так ли?Что вы подразумеваете в комментарии ниже текущего ответа, «динамически загружая * файлы», получая все файлы в папке, а затем перебрасывая их в новый класс »? Вы не можете передать файл в класс (вы можете указать ссылку на объект для класса). Как вы загружаете «файлы» в кеш? –

ответ

3

Более эффективным подходом может быть использование 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.

+1

Извините, так долго принимал ответ здесь (lol) Я боролся с тем, что делать, но ваш ответ заинтриговал меня больше всего. Я считаю себя ветераном-программистом (даже имея степень CS), но никогда не сталкивался с чем-то совершенно подобным (позор действительно). Это займет немного переработку некоторых классов, но это (я считаю) будет довольно эффективным. –

1

Вы ищете шаблон фабрики. Я нашел хорошую статью об этом здесь: http://alvinalexander.com/java/java-factory-pattern-example

Я предполагаю, что вам не нужно загружать файлы классов во время выполнения? Если бы это было так, я бы предложил посмотреть здесь: Method to dynamically load java class files

+0

Ум ... это, на самом деле, должно быть самораспаковывающимся приложением (как только это делается, конечно) никаких облачных вещей, происходящих здесь. –

+0

Я посмотрел на образец фабричного образца, который вы дали, и это было то, о чем я думал первоначально. Мне может понадобиться реализовать что-то подобное только из-за количества файлов, которые у меня есть. В настоящее время я уже динамически загружаю файлы, получая все файлы в папке, а затем добавляю их в новый класс, но меня беспокоит долгосрочная производительность, потому что я загружаю их все в кеш. –