TinyXml
在游戲中的作用
?
作者:
akinggw
?
前言
?
假如我們要在客戶端連接擁有不同
IP
地址的游戲服務器,我們應該怎樣做呢?《傳奇》中是使用一個
INI
文件來定義。這是一個好的辦法,我們每次使用時從外部導入我們的數據,而不用每次修改時都編程一次。而我們今天在這里要講解的是用
XML
文件來設置,關于什么是
XML
,請參考其它文章。
許多人將
XML
用到很多需要活動設置的應用,比如服務器參數的設置,玩家數據的管理(最近才發現的,原來以為是在數據庫中進行管理的,后來發現
XML
文件也能管理玩家數據,并且比操作數據庫要方便的多)。還有人甚至用
XML
文件來設置窗口界面??磥碚莆?/span>
XML
是非常有意義的。
?
TinyXml
?
我在這里并不是要講解如何使用
XML
,或在網頁中使用它。而是要在
C/C++
中使用它。詳細一點就是在
C/C++
嵌套使用
XML
文件。
要在
C/C++
中使用
XML
文件,你就必須需要一個能分析
XML
文件的函數庫。在這方面有很多,比如
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;
?
這段簡單的代碼的作用就是將用戶數據保存在
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;
?
這就是創建
XML
文件的過程。這段代碼將產生一個文件,文件內容如下:
?
<player admin="1">
??? <pos x="2" y="3" zone="4" />
</player>
?
它產生的結構可以用一棵樹來表示,見下圖:
?
|
圖注1
|
接下來,我們看一下如何從上面這個
XML
文件中讀出數據。
?
??? 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
文件打開后,先得到它的第一個子結點,如果子結點存在,得到這個結點的屬性。然后又打開這個結點的第一個子結點,讀出其中的數據。最后關閉文件句柄。
?
關于更多內容請訪問金橋科普網站(
http://popul.jqcq.com ?
)游戲開發欄目,如果你需要游戲開發方面的書籍請參考金橋書城游戲頻道(
http://book.jqcq.com/category/1_70_740.html
)。
如果你在閱讀本篇文章時有什么好的建議請來信給我,我的
E_mail: akinggw@126.com.
如果你在使用
SDL
時有什么問題,請到金橋科普網站(
http://popul.jqcq.com ?
)游戲開發欄目,我將詳細地為你解答。