TinyXml
在游戲中的作用
?
作者:
akinggw
?
前言
?
假如我們要在客戶端連接擁有不同
IP
地址的游戲服務(wù)器,我們應(yīng)該怎樣做呢?《傳奇》中是使用一個
INI
文件來定義。這是一個好的辦法,我們每次使用時從外部導(dǎo)入我們的數(shù)據(jù),而不用每次修改時都編程一次。而我們今天在這里要講解的是用
XML
文件來設(shè)置,關(guān)于什么是
XML
,請參考其它文章。
許多人將
XML
用到很多需要活動設(shè)置的應(yīng)用,比如服務(wù)器參數(shù)的設(shè)置,玩家數(shù)據(jù)的管理(最近才發(fā)現(xiàn)的,原來以為是在數(shù)據(jù)庫中進(jìn)行管理的,后來發(fā)現(xiàn)
XML
文件也能管理玩家數(shù)據(jù),并且比操作數(shù)據(jù)庫要方便的多)。還有人甚至用
XML
文件來設(shè)置窗口界面。看來掌握
XML
是非常有意義的。
?
TinyXml
?
我在這里并不是要講解如何使用
XML
,或在網(wǎng)頁中使用它。而是要在
C/C++
中使用它。詳細(xì)一點(diǎn)就是在
C/C++
嵌套使用
XML
文件。
要在
C/C++
中使用
XML
文件,你就必須需要一個能分析
XML
文件的函數(shù)庫。在這方面有很多,比如
libxml2,tinxml,expat
等等很多。而我使用的是
tinyxml
,為什么要使用它呢?因?yàn)樗苄∏桑挥袃蓚€頭文件和四個
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
個屬性。
?
接下來是將這個成員連接成上一個成員的子結(jié)點(diǎn)。
?
xElement.InsertEndChild(xPos);
?
然后再把上一個結(jié)點(diǎn)連接成為
XML
文件的子結(jié)點(diǎn)。
?
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)生的結(jié)構(gòu)可以用一棵樹來表示,見下圖:
?
|
圖注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
文件打開后,先得到它的第一個子結(jié)點(diǎn),如果子結(jié)點(diǎn)存在,得到這個結(jié)點(diǎn)的屬性。然后又打開這個結(jié)點(diǎn)的第一個子結(jié)點(diǎn),讀出其中的數(shù)據(jù)。最后關(guān)閉文件句柄。
?
關(guān)于更多內(nèi)容請?jiān)L問金橋科普網(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ā)欄目,我將詳細(xì)地為你解答。