cocos2dx下应用RapidXml作ConfigService遇到的问题

来源:互联网 发布:手机淘宝多图变大代码 编辑:程序博客网 时间:2024/04/26 03:14

背景:

希望在项目中增加一个ConfigService提供各种Object的配置。我们可以读取一个config节点,然后根据这个节点的config属性初始化合适的Object.

<?xml version="1.0" encoding="utf-8"?><Scenes>    <Scene Name="PromiseLand" Level="1-1" ObjectLevel="1">        <Blocks RigidBlock="100"/>        <Monster Mushroom1="50" Mushroom2="10"/>    </Scene>    <Scene Name="BoardLand" Level="1-2" ObjectLevel="1">        <Blocks RigidBlock1="50" RigidBlock2="100"/>        <Monster Mushroom="100"/>    </Scene></Scenes>

        如在这个Scene.xml文件中我们可以配置出一个Scene所具有的一些要素, Block 的类型(RigidBlock1, RigidBlock2), Monster的类型,当然RigidBlock1、RigiBlock2等等出现的元素在对应的文件中(Block.xml, Monster.xml)也可以得到配置。

这样我们就可以较为自由的配置场景中出现的物体。


初步思路:

据说TinyXml的性能要落后于RapidXml30倍,于是初步决定采用RapidXml来实现这个功能。

如下RIgidBlock的工厂函数:

static RigidBlock* createRigidBlock(CCPoint point, CCSize size, void *parm);

将存储着Block配置xml_node<> * blockNode,作为第三个参数传入。

在Win32下用起来感觉不错。


遇到问题:

RapidXml在读取我们的xml文件时出现了错误,主要问题是rapidxml::file 在构造时使用了basic_ifstream,它必须传入一个真实的文件指针,而不是经过android平台从apk包中解析出来的虚拟的文件。

解决方法:

细节可以参考这个链接:http://codingnow.cn/cocos2d-x/939.html,这个文档中有几处显而易见的错误,修改一下就好了。

大题思路就是在启动游戏时将asset中保存的xml文件单独copy到一个真实的物理位置中,这个位置可以使用CCFileUtils::sharedFileUtils()->getWritablePath()来得到。

然后使用rapidxml加载这个真实路径上的xml文件就不会再报错了,加载的路径可以由CCFileUtils::sharedFileUtils()->getWritablePath() + fileName得到。


疑问:

需不需要对rapidXml进行一次封装,不然的话程序各处都保持着对rapidxml的引用,目前还没有出现什么重大问题,但是如果将来出现问题,修改这些引用会要了亲命。

明天先放下其他的工作,研究一下对rapidxml进行一层封装必要性和可行性。


附上github : https://github.com/xdnm/Jump


0 0