2016-09-24 102 views
1

我正在用JavaFX構建一個RPG遊戲,需要得到專家的建議。Java遊戲設計課程加載

什麼是加載某些資源的正確方法?我不是在談論圖像和聲音,那部分很簡單。我在談論類。例如;我喜歡一些可以激活的奇怪的400多種能力。每個技能都有一個單獨的課程(或者我稱之爲arte)。要訪問此功能,我希望能夠撥打

Data.getArte(idOfArte); 

並且這應該返回一個Arte類型的對象。所有artes都有一個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,顯示瞭如何調用Java裏面的JavaScript功能。

+1

對不起,在這裏接受一個答案花了這麼長時間(大聲笑)我一直在努力做什麼,但你的答案最吸引我。我認爲自己是一位資深的程序員(即使擁有CS學位),但從未遇到過像這樣的事情(真的很遺憾)。這將需要一些類的修改,但是這(我相信)會非常高效。 –

1

您正在尋找工廠模式。我在這裏發現了一篇關於它的好文章:http://alvinalexander.com/java/java-factory-pattern-example

我假設你不必在運行時加載類文件?如果是這種情況,我建議看看這裏:Method to dynamically load java class files

+0

嗯......這實際上是假設自己打包的應用程序(一旦它完成了)當然沒有基於雲的東西在這裏進行。 –

+0

我看了一下你給出的Factory Pattern例子,這是我最初想到的。僅僅因爲我擁有的文件數量太多,我可能需要實現這樣的事情。目前我已經通過獲取文件夾中的所有文件來動態加載文件,然後將它們轉換爲新類,但是我擔心長期性能,因爲我將它們全部加載到緩存中。 –