TinyXml 在游戲中的作用
?
作者: akinggw
?
前言
?
假如我們要在客戶端連接擁有不同 IP 地址的游戲服務(wù)器,我們應(yīng)該怎樣做呢?《傳奇》中是使用一個(gè) INI 文件來(lái)定義。這是一個(gè)好的辦法,我們每次使用時(shí)從外部導(dǎo)入我們的數(shù)據(jù),而不用每次修改時(shí)都編程一次。而我們今天在這里要講解的是用 XML 文件來(lái)設(shè)置,關(guān)于什么是 XML ,請(qǐng)參考其它文章。
許多人將 XML 用到很多需要活動(dòng)設(shè)置的應(yīng)用,比如服務(wù)器參數(shù)的設(shè)置,玩家數(shù)據(jù)的管理(最近才發(fā)現(xiàn)的,原來(lái)以為是在數(shù)據(jù)庫(kù)中進(jìn)行管理的,后來(lái)發(fā)現(xiàn) XML 文件也能管理玩家數(shù)據(jù),并且比操作數(shù)據(jù)庫(kù)要方便的多)。還有人甚至用 XML 文件來(lái)設(shè)置窗口界面。看來(lái)掌握 XML 是非常有意義的。
?
TinyXml
?
我在這里并不是要講解如何使用 XML ,或在網(wǎng)頁(yè)中使用它。而是要在 C/C++ 中使用它。詳細(xì)一點(diǎn)就是在 C/C++ 嵌套使用 XML 文件。
要在 C/C++ 中使用 XML 文件,你就必須需要一個(gè)能分析 XML 文件的函數(shù)庫(kù)。在這方面有很多,比如 libxml2,tinxml,expat 等等很多。而我使用的是 tinyxml ,為什么要使用它呢?因?yàn)樗苄∏桑挥袃蓚€(gè)頭文件和四個(gè) CPP 文件。正如作者在 tinyxml 官方文件中所說(shuō)的,如果你不是想在瀏覽器中使用 XML ,那么 tinyxml 非常適合你。
?
我們下面來(lái)看一下 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;
?
這段簡(jiǎn)單的代碼的作用就是將用戶數(shù)據(jù)保存在 XML 文件中。不同的是我對(duì)其做了一些簡(jiǎn)化。
?
這段代碼的作用就是先建立一個(gè) XML 文件句柄。
?
TiXmlDocument* m_xmlDoc = new TiXmlDocument();
?
然后建立一個(gè)成員。
?
TiXmlElement xElement("player");
sprintf(buffer,"%d", 1);
xElement.SetAttribute("admin", buffer);
?
然后再建立一個(gè)成員。
?
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);
?
這個(gè)成員包含 3 個(gè)屬性。
?
接下來(lái)是將這個(gè)成員連接成上一個(gè)成員的子結(jié)點(diǎn)。
?
xElement.InsertEndChild(xPos);
?
然后再把上一個(gè)結(jié)點(diǎn)連接成為 XML 文件的子結(jié)點(diǎn)。
?
最后保存這個(gè)文件。
sprintf(floader,"%s.xml", "antking");
m_xmlDoc->SaveFile(floader);
?
釋放句柄。
?
delete m_xmlDoc;
?
這就是創(chuàng)建 XML 文件的過(guò)程。這段代碼將產(chǎn)生一個(gè)文件,文件內(nèi)容如下:
?
<player admin="1">
??? <pos x="2" y="3" zone="4" />
</player>
?
它產(chǎn)生的結(jié)構(gòu)可以用一棵樹(shù)來(lái)表示,見(jiàn)下圖:
?
|
| 圖注1 |
接下來(lái),我們看一下如何從上面這個(gè) 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);?????????????
?
這段代碼的意思就是,先建立一個(gè)文件句柄,如果句柄建立成功就打開(kāi)一個(gè) XML 文件。 XML 文件打開(kāi)后,先得到它的第一個(gè)子結(jié)點(diǎn),如果子結(jié)點(diǎn)存在,得到這個(gè)結(jié)點(diǎn)的屬性。然后又打開(kāi)這個(gè)結(jié)點(diǎn)的第一個(gè)子結(jié)點(diǎn),讀出其中的數(shù)據(jù)。最后關(guān)閉文件句柄。
?
關(guān)于更多內(nèi)容請(qǐng)?jiān)L問(wèn)金橋科普網(wǎng)站( http://popul.jqcq.com ? )游戲開(kāi)發(fā)欄目,如果你需要游戲開(kāi)發(fā)方面的書(shū)籍請(qǐng)參考金橋書(shū)城游戲頻道( http://book.jqcq.com/category/1_70_740.html )。 如果你在閱讀本篇文章時(shí)有什么好的建議請(qǐng)來(lái)信給我,我的 E_mail: akinggw@126.com. 如果你在使用 SDL 時(shí)有什么問(wèn)題,請(qǐng)到金橋科普網(wǎng)站( http://popul.jqcq.com ? )游戲開(kāi)發(fā)欄目,我將詳細(xì)地為你解答。

