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

背景:

希望在项目中增加一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值