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 文件的子結點。
?
最后保存這個文件。
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ā)欄目,我將詳細地為你解答。