XNA使用XML讀取資料

摘要:XNA使用XML讀取資料

這篇好像之前help有問過我的樣子

只是當時沒有時間去看看要怎麼做,現在暑假到了,所以剛好就研究一下

XML是延伸的標記檔案,最近很多應用軟體都用XML當作中繼描述來用
(像是儲存資料、設定檔等)

可能有些人在增加Content的時候,會發現到除了SpriteBatch之類的東西還會看到XML但是要怎麼始用他呢? 怎麼把它運用在XNA理面?

XNA所有Content都是把他編譯成XNB檔案(聲音部分除外)

所以我們也必須要把XML檔案資訊抓取出來再把他寫(ContentTypeWriter)到XNB中

然後在執行中的時後再把它讀(ContentTypeReader)出來

首先先開啟一個新的專案,我把它取名為"XMLtest"作為專案名稱

我們新增一個XML檔案在Content中,檔名為"XML.xml"

打開來以後可以看到內容為


<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <!-- TODO: replace this Asset with your own XML asset data. -->
  <Asset Type="System.String"></Asset>
</XnaContent>


再來我們為了要做一些測試,所以我們就新增一些測試的數值在XML中
變數的話記得他是用標籤的方式格式為
<變數名稱>數值</變數名稱>

修正過後為


<?xml version="1.0" encoding="utf-8" ?>
<XnaContent>
  <Asset Type="XMLPipeline.XMLContent">
    <name>test</name>
    <map>terain.bmp</map>
  </Asset>
</XnaContent>



再來我們來寫一個字訂的Content Processor來將XML的檔案寫入XNB中

在方案那邊,我們按下右鍵,增加一個新的專案,選擇空白的類別庫(他會把這個專案編譯成dll檔)

增加好空白類別庫以後,在來新增一下reference,因為預設的沒有包含XNA freamwork,所以我們要新增一些reference
Microsoft.Xna.Framework
Microsoft.Xna.Framework.Content.Pipeline
Microsoft.Xna.Framework.Game

需要這三個reference

加入以後我們要加入兩個類別分別取名為,XMLContent.cs以及XMLWriter.cs

在XMLContent.cs中,就是對應到XML資料


namespace XMLPipeline
{
    public class XMLContent
    {
        public string name = null;
        public string map = null;
    }
}


這邊要注意的就是他的名字要跟XML的標籤對應,也就是看你的XML標籤變數名稱是甚麼,這邊對應的類別field也是要依樣

再來就是要寫XMLWriter.cs的內容,這邊做的事情就是要寫入XML的資料到XNB中


namespace XMLPipeline
{
    [ContentTypeWriter]
    class XMLWriter : ContentTypeWriter<XMLContent>
    {
        protected override void Write(ContentWriter output, XMLContent value)
        {
            output.Write(value.name);
            output.Write(value.map);
        }
       
        public override string GetRuntimeReader(TargetPlatform targetPlatform)
        {
            return "XMLtest.setReader, XMLtest";
        }
    }
}


這邊比較要注意的就是GetRuntimeReader的function,他是用來對應到Reader的部分
回傳值就是"專案名稱.類別名稱,專案名稱"

以上就是XMLPipeline的部分,接下來回到XMLtest的專案中

我們先新增幾個類別,叫做set.cs以及setReader.cs

set.cs就是用來儲存XML的資料,這邊儲存的資料,是從Reader中抓出來的資料


namespace XMLtest
{
    class set
    {
        public string name = null;
        public string map = null;
    }
}


 

Download Code

PS : 本程式碼沒有顯示輸出結果,請善用中斷點檢查變數內容