zl程序教程

您现在的位置是:首页 >  其他

当前栏目

TinyXml在游戏中的作用

游戏 作用
2023-09-27 14:27:55 时间

假如我们要在客户端连接拥有不同IP地址的游戏服务器,我们应该怎样做呢?《传奇》中是使用一个INI文件来定义。这是一个好的办法,我们每次使用时从外部导入我们的数据,而不用每次修改时都编程一次。而我们今天在这里要讲解的是用XML文件来设置,关于什么是XML,请参考其它文章。
许多人将XML用到很多需要活动设置的应用,比如服务器参数的设置,玩家数据的管理(最近才发现的,原来以为是在数据库中进行管理的,后来发现XML文件也能管理玩家数据,并且比操作数据库要方便的多)。还有人甚至用XML文件来设置窗口界面。看来掌握XML是非常有意义的。

TinyXml

我在这里并不是要讲解如何使用XML,或在网页中使用它。而是要在C/C++中使用它。详细一点就是在C/C++嵌套使用XML文件。
要在C/C++中使用XML文件,你就必须需要一个能分析XML文件的函数库。在这方面有很多,比如libxml2,tinxml,expat等等很多。而我使用的是tinyxml,为什么要使用它呢?因为它很小巧,只有两个头文件和四个CPP文件。正如作者在tinyxml官方文件中所说的,如果你不是想在浏览器中使用XML,那么tinyxml非常适合你。

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

     

None.gifchar floader[200],buffer[200];
None.gif    
None.gifTiXmlDocument* m_xmlDoc = new TiXmlDocument();
None.gif
None.gifTiXmlElement xElement("player");
None.gifsprintf(buffer,"%d", 1);
None.gifxElement.SetAttribute("admin", buffer);
None.gif
None.gifTiXmlElement xPos("pos");
None.gif
None.gifsprintf(buffer,"%d",2);
None.gifxPos.SetAttribute("x", buffer);
None.gif
None.gifsprintf(buffer,"%d",3);
None.gifxPos.SetAttribute("y", buffer);
None.gif
None.gifsprintf(buffer,"%d",4);
None.gifxPos.SetAttribute("zone", buffer);
None.gif
None.gifxElement.InsertEndChild(xPos);
None.gifm_xmlDoc- InsertEndChild(xElement);
None.gif
None.gifsprintf(floader,"%s.xml", "antking");
None.gifm_xmlDoc- SaveFile(floader);
None.gif
None.gifdelete m_xmlDoc;
None.gif

 

这段简单的代码的作用就是将用户数据保存在XML文件中。不同的是我对其做了一些简化。

这段代码的作用就是先建立一个XML文件句柄。

TiXmlDocument* m_xmlDoc = new TiXmlDocument();

然后建立一个成员。

TiXmlElement xElement("player");
sprintf(buffer,"%d", 1);
xElement.SetAttribute("admin", buffer);

然后再建立一个成员。

 

None.gifTiXmlElement xPos("pos");
None.gif
None.gifsprintf(buffer,"%d",2);
None.gifxPos.SetAttribute("x", buffer);
None.gif
None.gifsprintf(buffer,"%d",3);
None.gifxPos.SetAttribute("y", buffer);
None.gif
None.gifsprintf(buffer,"%d",4);
None.gifxPos.SetAttribute("zone", buffer);
None.gif

 

这个成员包含3个属性。

接下来是将这个成员连接成上一个成员的子结点。

xElement.InsertEndChild(xPos);

然后再把上一个结点连接成为XML文件的子结点。

m_xmlDoc- InsertEndChild(xElement);

最后保存这个文件。

None.gifsprintf(floader,"%s.xml", "antking");
None.gifm_xmlDoc- SaveFile(floader);

 

释放句柄。

delete m_xmlDoc;

这就是创建XML文件的过程。这段代码将产生一个文件,文件内容如下:

 

None.gif player admin="1"
None.gif     pos x="2" y="3" zone="4" /
None.gif /player

 

它产生的结构可以用一棵树来表示,见下图:

 

接下来,我们看一下如何从上面这个XML文件中读出数据。

    

None.gifchar floader[200],buffer[200];
None.gif    
None.gif    TiXmlDocument* m_xmlDoc;
None.gifint admin1,x1,y1,z1; 
None.gif
None.gifsprintf(floader,"%s.xml", "antking");
None.gif
None.gifm_xmlDoc = new TiXmlDocument(floader);
None.gif
None.gifif (m_xmlDoc- LoadFile())
ExpandedBlockStart.gif{
InBlock.gifTiXmlElement *xPlayer = 0;
InBlock.gifxPlayer = m_xmlDoc- FirstChildElement("player");
InBlock.gif
InBlock.gifif (xPlayer)
ExpandedSubBlockStart.gif{
InBlock.gifif (xPlayer- Attribute("admin"))
InBlock.gifadmin1= (bool)atoi(xPlayer- Attribute("admin"));
InBlock.gif
InBlock.gifTiXmlElement *xZone = 0;
InBlock.gifxZone = xPlayer- FirstChildElement("pos");
InBlock.gif
InBlock.gifx1 = (int)atoi(xZone- Attribute("x"));
InBlock.gify1 = (int)atoi(xZone- Attribute("y"));
InBlock.gifz1 = (int)atoi(xZone- Attribute("zone"));
ExpandedSubBlockEnd.gif}
ExpandedBlockEnd.gif}
None.gif
None.gifdelete m_xmlDoc;
None.gifprintf("%d,%d,%d,%d",admin1,x1,y1,z1); 
None.gif

 

这段代码的意思就是,先建立一个文件句柄,如果句柄建立成功就打开一个XML文件。XML文件打开后,先得到它的第一个子结点,如果子结点存在,得到这个结点的属性。然后又打开这个结点的第一个子结点,读出其中的数据。最后关闭文件句柄。


【拥抱元宇宙】创建你的第一个Unity程序HelloWorld,并发布 需要先下载一个Unity Hub,以及安装Unity编辑器。Unity Hub需要登陆,激活码可以选择个人用户,免费的。免费的无法改变启动画面,其他的都还好。以下案例,我以Unity2020.3.22 LTS 版本进行创建,其他大佬们可以根据自己情况选择版本。
【Unity3D 灵巧小知识点】☀️ | 使用宏定义和Application.platform判断运行平台 Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)
本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)
本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)