2009-04-23 36 views
0

我想從定義文件(XML)中加載遊戲對象,然後在準備好的屬性(如武器,紋理,最大速度,視距等)中創建它們。我想到IClonable接口,但它似乎很奇怪。此外,我需要區分單位(士兵,車輛也許是飛機)和建築物。從他們的定義中加載遊戲對象

+8

你的問題是什麼? – JoshJordan 2009-04-23 16:29:09

+0

如何設計這個「系統」。 jmucchiello已經回答了(用通用工廠調用特定的工廠),但我只想解析定義文件一次(最好在啓動時) – mnn 2009-04-23 17:36:07

回答

0

聽起來像你想要一個可以調用特定工廠的一般工廠。通用工廠採用定義文件並確定對象的通用類型「武器,單位,建築物」。然後它將DOM樹傳遞給該類型的特定工廠。武器工廠知道如何在系統中構建所有不同的武器。並且它將DOM樹傳遞給武器的構造函數,以便構造函數可以使用所有的細節。

您如何編寫這些工廠取決於您的XML的外觀以及您希望實現「自動化」的方式。您需要提供更多具體信息以獲得更具體的答案。

編輯:現在我明白了。您希望將XML文件用作未來對象創建的模板。你想要一個通用的「車輛」對象。你加載「直升機」的XML文件,它創建了一個新的「車輛」類,而實際上並沒有創建一個類,對吧?

因此,您將創建一個車輛「班級」,所有車輛都將從此處下降。然後,您創建一個所有模板下降的車輛模板「類」。 XML用於實例化模板類。模板類用於實例化實際的對象。

class vehicle_template { 
    vechicle_template(xmlstreamthing x); 
    // properties found in vehicles, set from xml 
}; 
class vehicle { 
    vechicle(vehicle_template v); 
    // properties vehicles have, taken from template 
}; 
vehicle vehicle_factory(string s) { 
    static map<string,vehicle_template> already_loaded; 
    vehicle_template vt = already_loaded.find(s); 
    if (vt == null) { 
     xmlstreamthing xml = get_xml_from_object_name(s); // you need to figure this part out 
     if (xml == null) { 
      throw no_such_vehicle(s); 
     } 
     vt = new vehicle_template(xml); 
     already_loaded.add(s,v); 
    } 
    return new vehicle(vt); 
} 

顯然這不是可運行的代碼,但它應該讓你開始。

我不知道如何讓這些對象的行爲有所不同,但這應該可以解決您的加載問題。也許你需要一種鴨式語言,你可以在運行時向對象添加方法。