更有效的方法可能是使用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,顯示瞭如何調用Java裏面的JavaScript功能。
@PhilipVaughn你能澄清一下你的意思嗎?你實際上只是在詢問創建對象,而不是加載類,對嗎?通過「通過獲取文件夾中的所有文件然後將它們轉換爲新類」動態加載*文件*,在當前答案下面的評論中,你是什麼意思?您不能將文件轉換爲類(您可以將對象引用轉換爲類)。你如何將「文件」加載到緩存中? –