XNA-使用xml

XNA-使用xml

一個較完整的遊戲幾乎都會需要設定的檔案,現在就來介紹xml在xna裡的用法。

新開一個xna專案,在Content目錄按滑鼠右鍵選Add > 新增項目,會出現可以新增的內容,我們選擇XML檔。

image

開啟此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);
}

這樣我們就可以在畫面上畫出此段文字

image

但是,這能幹嘛?用xml只為了存一段文字也太無聊了吧!

因為xna會將content檔案轉成xnb檔,以便可以適用於xbox360等非window平台的機器,

所以若是使用我們自己定義的物件,就需要額外寫一個轉換用的,接著就是讓我們決定此xml用我們自己的物件來解析吧。

首先加入新的專案,選擇Library:

image

並且在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>

執行結果如下:

image

範例程式碼:XNA-使用xml.rar