2009-06-16 46 views
0

我正在XNA中編寫一個小型的2D射擊遊戲,並且我已經決定,爲了能夠在遊戲中實現定製內容,它會加載遊戲對象的定義來自XML文件。當我發現XNA有一個易於使用的XML序列化器時,它變得更加簡單。問題是,我想要序列化的對象是DrawableGameComponent s。 XNA的XML序列化程序,ContentTypeWriter類,您擴展以創建自定義內容編寫器,要求該對象有一個沒有參數默認值的構造函數。然而,DrawableGameComponent的構造函數需要一個Game對象,並且不會讓對象初始化後設置遊戲。但是,我無法修改ContentTypeWriter的行爲,但是,要接受非空白構造函數,因爲內容是通過完全不同的方法加載的,我無法覆蓋它。所以基本上我有這個:使用XNA的ContentTypeWriter類將XML DrawableGameComponent作爲XML序列化

class Star : DrawableGameComponent{ 
    public Star(Game game) 
     : base(game) 
    { 
    } 
} 

ContentTypeWriter需要一個沒有參數的構造函數。我不能創建一個,因爲那樣我就沒有辦法讓一個Game對象進入Star類。我只是不讓它DrawableGameComponent,但我想從主遊戲類,這樣我可以重新使用它們,等等,沒有一個Game對象,這是荒謬難以分離這些對象。因此,我的問題是,有誰知道如何修改ContentTypeWriter足以允許帶參數的構造函數或任何方法?

我也想過使用XPath或Linq XML類編寫我自己的XML解析代碼,但是如果項目中有任何不遵循XNA架構並且不會構建的XML文件,XNA會拋出一個適合的問題。僅使用類的主要字段和使用裝飾器模式的DrawableGameComponent版本編寫基類,並僅序列化基類是否合理?我拉着頭髮試圖解決這個問題,並想知道在這種情況下我應該做什麼。

回答

2

我還通過建設水平解析文件級別,我用的System.Xml加載數據。我改變了性質上的XML文件,我添加到以下: 生成操作:無 複製到輸出目錄:複製如果較新

然後我寫了一些像這樣的代碼:

public static LevelInfo LoadLevel(
    string xmlFile, 
    GraphicsDevice device, 
    PhysicsSimulator sim, 
    ContentManager content) 
{ 
    FileInfo xmlFileInfo = new FileInfo(xmlFile); 

    XDocument fileDoc = XDocument.Load(xmlFile); 
    //this part is game specific 
    LevelInfo levelData = new LevelInfo(); 
    levelData.DynamicObjects = LevelLoader.LoadDynamicObjects(device, sim, content, xmlFileInfo, fileDoc); 
    levelData.StaticObjects = LevelLoader.LoadStaticObjects(device, sim, content, xmlFileInfo, fileDoc); 
    levelData.LevelAreas = LevelLoader.LoadAreas(device, xmlFileInfo, fileDoc); 
    return levelData; 
} 

這只是一個示例,但它可以讓您使用任何想要的XML數據創建對象。

對於那些好奇,這裏的xml文件:

<Level> 
    <Object Type="Custom" 
      PositionX="400" 
      PositionY="400" 
      IsStatic="true" 
      Rotation="0" 
      Texture="sampleObj1_geometrymap" 
      Mass="5" 
      ColorR="0" 
      ColorG="255" 
      ColorB="0"> 
    </Object> 
    <Object Type="Custom" 
      PositionX="400" 
      PositionY="600" 
      IsStatic="false" 
      Rotation="0" 
      Texture="sampleObj2_geometrymap" 
      Mass="5" 
      ColorR="230" 
      ColorG="230" 
      ColorB="255"> 
    </Object> 
    <Object Type="Area" 
      MinPositionX="0" 
      MinPositionY="0" 
      MaxPositionX="300" 
      MaxPositionY="300" 
      AreaType="Goal"> 
    </Object> 
</Level>