2013-12-08 45 views
2

我目前正在使用Java在我的業餘時間使用馬里奧式平臺遊戲作爲一種嘗試我沒有經驗的概念的方法。其中之一是加載和存儲XML文件中的信息,以便遊戲在理論上可以由最終用戶或編輯工具進行修改,而不需要源代碼/重新編譯遊戲。Java正在加載XML未知類類型

到目前爲止,我一直都很成功,但我處於一個完全不確定如何發展的階段。我試圖從XML文件中加載將在某個級別上找到的實體。 XML文件當前包含其他信息,例如地圖位置和玩家生成點,這些信息可以使用w3c文檔對象模型正確工作。

我的困難來自於我需要從文件中加載多種類型的實體(特殊塊,怪物等),我真的不希望每次都在我的加載器方法中使用硬編碼所以當添加一個新類時,例如Monster3.java,我可以簡單地在我的XML文件中添加幾行,並且不用編輯加載器方法就可以創建Monster3s。

這裏是我的級別文件的當前格式:

<level> 
    <map>data\level2.tmx</map> 

    <player file="data\player.xml"> 
     <x>0</x> 
     <y>48</y> 
    </player> 

    <entities> 
     <entity type="monster1" file="data\monster1.xml"> 
      <x>48</x> 
      <y>48</y> 
     </entity> 

     <entity type="monster1" file="data\monster.xml"> 
      <x>96</x> 
      <y>48</y> 
     </entity>  
    </entities> 
</level> 

只是爲了一些背景信息,所有的怪物擴展中心實體類。他們都有自己的構造函數來爲那種類型的怪物設置特定的細節,這些怪物用相同的參數(一個代表文件位置的字符串和一個具有開始位置的Vector2)調用super。我不希望被交代碼,我只是想推向正確的方向。

+0

'Monster1','Monster2','Monster3'等都是不同的類?爲什麼? – nhgrif

+0

我不打算對每個實體都有相同的行爲。實體類用於動態的任何事物,例如硬幣或特殊塊。 – that0n3guy

+0

我明白'Coin'類和'Monster'類可能是必需的。我不明白的是爲什麼每個「怪物」都需要它自己的類,爲什麼他們不能使用同一個「怪物」類。 – nhgrif

回答

1

你在這裏找的是'反射'

//Fully qualified name 
String typeName = "com.yourcompany.product.Monster3"; 

try { 
    //Class from name 
    Class<?> myClass = Class.forName(typeName); 

    //Constructor from Parameter types... 
    Class<?>[] types = {Double.TYPE, String.class}; 
    Constructor constructor = myClass.getConstructor(types); 

    //Instance from Parameter values... 
    Object[] parameters = {new Double(0), "Hello"}; 
    Object instanceOfMyClass = constructor.newInstance(parameters); 

} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { 
    ex.printStackTrace(); 
} 

注意
這裏有一個重要的問題是類型安全。
當您的軟件變大時,調試將越來越困難。
所以我建議使用抽象工廠模式這似乎適合我的你的用例。
另外,花時間實現類型安全的抽象工廠(使用當然泛型)以後使生活更輕鬆是明智的。

希望這有助於

相關問題