XNA-使用xml
一個較完整的遊戲幾乎都會需要設定的檔案,現在就來介紹xml在xna裡的用法。
新開一個xna專案,在Content目錄按滑鼠右鍵選Add > 新增項目,會出現可以新增的內容,我們選擇XML檔。
開啟此xml檔,我們加上「XML DEMO」此文字,
<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
<Asset Type="System.String">XML DEMO</Asset>
</XnaContent>
接著在主程式裡加入以下程式碼:
SpriteFont defaultFont;
string xmlDemo;
protected override void LoadContent() {
spriteBatch = new SpriteBatch(GraphicsDevice);
defaultFont = Content.Load<SpriteFont>("Default");
xmlDemo = Content.Load<string>("XMLFile1");
}
protected override void Draw(GameTime gameTime) {
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.DrawString(defaultFont, xmlDemo, Vector2.Zero, Color.Black);
spriteBatch.End();
base.Draw(gameTime);
}
這樣我們就可以在畫面上畫出此段文字
但是,這能幹嘛?用xml只為了存一段文字也太無聊了吧!
因為xna會將content檔案轉成xnb檔,以便可以適用於xbox360等非window平台的機器,
所以若是使用我們自己定義的物件,就需要額外寫一個轉換用的,接著就是讓我們決定此xml用我們自己的物件來解析吧。
首先加入新的專案,選擇Library:
並且在Library專案加入Microsoft.Xna.Framework.Content.Pipeline的參考
然後定義我們自己的物件:
public class PlayerData {
public string Name;
public int HP;
public int MP;
[ContentSerializerIgnore]
public int Score;
}
我們想記錄名稱、hp和mp,但是分數卻是後來才有的,所以加上[ContentSerializerIgnore]屬性,表示他並不需要解析。
而物件裡的變數名稱必須和xml裡的標籤名稱一樣才行。
然後要做Reader和Writer
[ContentTypeWriter]
public class PlayerDataWriter : ContentTypeWriter<PlayerData> {
protected override void Write(ContentWriter output, PlayerData value) {
output.Write(value.Name);
output.Write(value.HP);
output.Write(value.MP);
}
public override string GetRuntimeReader(TargetPlatform targetPlatform) {
return "XMLLibrary.PlayerDataReader, XMLLibrary";
}
}
public class PlayerDataReader : ContentTypeReader<PlayerData> {
protected override PlayerData Read(ContentReader input, PlayerData existingInstance) {
PlayerData data = existingInstance;
if (data == null) {
data = new PlayerData();
}
data.Name = input.ReadString();
data.HP = input.ReadInt32();
data.MP = input.ReadInt32();
return data;
}
}
Writer的GetRuntimeReader需要回傳物件的型態,格式為”Namespace.Class, Namespace”
之後我們只要在xml裡設定參數就可以了:
<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
<Asset Type="XMLLibrary.PlayerData">
<Name>Demo Player</Name>
<HP>100</HP>
<MP>50</MP>
</Asset>
</XnaContent>
執行結果如下:
範例程式碼:XNA-使用xml.rar