TinyXml 在游戲中的作用

?

作者: akinggw

?

前言

?

假如我們要在客戶端連接擁有不同 IP 地址的游戲服務器,我們應該怎樣做呢?《傳奇》中是使用一個 INI 文件來定義。這是一個好的辦法,我們每次使用時從外部導入我們的數(shù)據(jù),而不用每次修改時都編程一次。而我們今天在這里要講解的是用 XML 文件來設置,關于什么是 XML ,請參考其它文章。

許多人將 XML 用到很多需要活動設置的應用,比如服務器參數(shù)的設置,玩家數(shù)據(jù)的管理(最近才發(fā)現(xiàn)的,原來以為是在數(shù)據(jù)庫中進行管理的,后來發(fā)現(xiàn) XML 文件也能管理玩家數(shù)據(jù),并且比操作數(shù)據(jù)庫要方便的多)。還有人甚至用 XML 文件來設置窗口界面。看來掌握 XML 是非常有意義的。

?

TinyXml

?

我在這里并不是要講解如何使用 XML ,或在網(wǎng)頁中使用它。而是要在 C/C++ 中使用它。詳細一點就是在 C/C++ 嵌套使用 XML 文件。

要在 C/C++ 中使用 XML 文件,你就必須需要一個能分析 XML 文件的函數(shù)庫。在這方面有很多,比如 libxml2,tinxml,expat 等等很多。而我使用的是 tinyxml ,為什么要使用它呢?因為它很小巧,只有兩個頭文件和四個 CPP 文件。正如作者在 tinyxml 官方文件中所說的,如果你不是想在瀏覽器中使用 XML ,那么 tinyxml 非常適合你。

?

我們下面來看一下 tinyxml 是如何在 C/C++ 中建立 XML 文件的。

?

? ??????? ???char floader[200],buffer[200];

???

?????????????? ?????? TiXmlDocument* m_xmlDoc = new TiXmlDocument();

?

?????????????? ?????? TiXmlElement xElement("player");

?????????????? ?????? sprintf(buffer,"%d", 1);

?????????????? ?????? xElement.SetAttribute("admin", buffer);

?

?????????????? ?????? TiXmlElement xPos("pos");

?

?????????????? ?????? sprintf(buffer,"%d",2);

?????????????? ?????? xPos.SetAttribute("x", buffer);

?

?????????????? ?????? sprintf(buffer,"%d",3);

?????????????? ?????? xPos.SetAttribute("y", buffer);

?

?????????????? ?????? sprintf(buffer,"%d",4);

?????????????? ?????? xPos.SetAttribute("zone", buffer);

?

?????????????? ?????? xElement.InsertEndChild(xPos);

?????????????? ?????? m_xmlDoc->InsertEndChild(xElement);

?

?????????????? ?????? sprintf(floader,"%s.xml", "antking");

?????????????? ?????? m_xmlDoc->SaveFile(floader);

?

?????????????? ?????? delete m_xmlDoc;

?

這段簡單的代碼的作用就是將用戶數(shù)據(jù)保存在 XML 文件中。不同的是我對其做了一些簡化。

?

這段代碼的作用就是先建立一個 XML 文件句柄。

?

TiXmlDocument* m_xmlDoc = new TiXmlDocument();

?

然后建立一個成員。

?

TiXmlElement xElement("player");

sprintf(buffer,"%d", 1);

xElement.SetAttribute("admin", buffer);

?

然后再建立一個成員。

?

TiXmlElement xPos("pos");

?

sprintf(buffer,"%d",2);

xPos.SetAttribute("x", buffer);

?

sprintf(buffer,"%d",3);

xPos.SetAttribute("y", buffer);

?

sprintf(buffer,"%d",4);

xPos.SetAttribute("zone", buffer);

?

這個成員包含 3 個屬性。

?

接下來是將這個成員連接成上一個成員的子結點。

?

xElement.InsertEndChild(xPos);

?

然后再把上一個結點連接成為 XML 文件的子結點。

?

m_xmlDoc->InsertEndChild(xElement);

最后保存這個文件。

sprintf(floader,"%s.xml", "antking");

m_xmlDoc->SaveFile(floader);

?

釋放句柄。

?

delete m_xmlDoc;

?

這就是創(chuàng)建 XML 文件的過程。這段代碼將產(chǎn)生一個文件,文件內(nèi)容如下:

?

<player admin="1">

??? <pos x="2" y="3" zone="4" />

</player>

?

它產(chǎn)生的結構可以用一棵樹來表示,見下圖:

?

圖注1

接下來,我們看一下如何從上面這個 XML 文件中讀出數(shù)據(jù)。

?

??? char floader[200],buffer[200];

???

??? TiXmlDocument* m_xmlDoc;

int admin1,x1,y1,z1;????????????????????

?

??????? ?????? sprintf(floader,"%s.xml", "antking");

?

??????? ?????? m_xmlDoc = new TiXmlDocument(floader);

?

?????????????? if (m_xmlDoc->LoadFile())

?????????????? {

?????????????? ?????? TiXmlElement *xPlayer = 0;

?????????????? ?????? xPlayer = m_xmlDoc->FirstChildElement("player");

?

?????????????? ?????? if (xPlayer)

?????????????? ?????? {

?????????????? ????????????? if (xPlayer->Attribute("admin"))

?????????????? ????????????? ?????? admin1= (bool)atoi(xPlayer->Attribute("admin"));

?

?????????????? ?????? ?????? TiXmlElement *xZone = 0;

????????????? ????????????? xZone = xPlayer->FirstChildElement("pos");

?

?????????????? ????????????? x1 = (int)atoi(xZone->Attribute("x"));

?????????????? ????????????? y1 = (int)atoi(xZone->Attribute("y"));

?????????????? ????????????? z1 = (int)atoi(xZone->Attribute("zone"));

?????????????? ?????? }

?????????????? }

?

??????? ?????? delete m_xmlDoc;

printf("%d,%d,%d,%d",admin1,x1,y1,z1);?????????????

?

這段代碼的意思就是,先建立一個文件句柄,如果句柄建立成功就打開一個 XML 文件。 XML 文件打開后,先得到它的第一個子結點,如果子結點存在,得到這個結點的屬性。然后又打開這個結點的第一個子結點,讀出其中的數(shù)據(jù)。最后關閉文件句柄。

?

關于更多內(nèi)容請訪問金橋科普網(wǎng)站( http://popul.jqcq.com ? )游戲開發(fā)欄目,如果你需要游戲開發(fā)方面的書籍請參考金橋書城游戲頻道( http://book.jqcq.com/category/1_70_740.html )。 如果你在閱讀本篇文章時有什么好的建議請來信給我,我的 E_mail: akinggw@126.com. 如果你在使用 SDL 時有什么問題,請到金橋科普網(wǎng)站( http://popul.jqcq.com ? )游戲開發(fā)欄目,我將詳細地為你解答。