用cocos2d3.0写一个srpg游戏-从配置文件中读取敌我出战阵容(一)

很简单的步骤

1.读取配置文件

2.根据配置文件显示敌我阵容

然后细化下。

1.配置文件格式用了JSON

既然用了JSON,就需要找一个JSON解析库,然后COCOS2DX3.0自动了个JSON库:rapidjson

不知道是我经验不足还是什么,然后觉得他自带的JSON解析不是我想要的,然后C++又不支持反射,

所以,我就采用了下面这种方式解析JSON。来让他可以像GSON一样解析JSON。

首先是绑定对应的关系,如INT,STRING,CLASS等

首先你定义一个基类,JsonHelper

enum CEnumJsonTypeMap

    {

        asInt = 1,

        asUInt,

        asString,

        asInt64,

        asUInt64,

        asClass,

    };

    

    void SetProperty(string name, CEnumJsonTypeMap type, void* addr);

    

    

    vector<string> m_listName;

    vector<void*>  m_listPropertyAddr;

    vector<CEnumJsonTypeMap> m_listType;

-----------------

void JsonHelper::SetProperty(string name, CEnumJsonTypeMap type, void* addr)

{

    m_listName.push_back(name);

    m_listPropertyAddr.push_back(addr);

    m_listType.push_back(type);

}


然后假设你有一个属性类 TestJsonParse

在这个类里面你实现一个构造,

构造里面如这样

TestJsonParse::TestJsonParse(){

    testJsonParse1=new TestJsonParse1();

    SetProperty("MsgID", asInt, &MsgID);

    SetProperty("MsgTitle", asString, &MsgTitle);

    SetProperty("MsgContent", asString, &MsgContent);

    SetProperty("object", asClass, testJsonParse1);

}


绑定对应的关系

然后JsonHelper里面还要加一点东西,就是要根据类型去解析特定的数据

bool JsonHelper::DeSerialize(const char* str){

    

    rapidjson::Document d;

    d.Parse<0>(str);

    if (d.HasParseError())  //解析错误

    {

        CCLOG("GetParseError %s\n",d.GetParseError());

    }else{

        int nSize = m_listName.size();

        for (int i=0; i < nSize; ++i ){

            void* pAddr = m_listPropertyAddr[i];

            switch(m_listType[i]){

                case asInt:

                    (*(int*)pAddr) = d[m_listName[i].c_str()].GetInt();

                    break;

                case asUInt:

                    (*(unsigned*)pAddr) = d[m_listName[i].c_str()].GetUint();

                    break;

                case asInt64:

                    (*(int64_t*)pAddr) = d[m_listName[i].c_str()].GetInt64();

                    break;

                case asUInt64:

                    (*(uint64_t*)pAddr) = d[m_listName[i].c_str()].GetUint64();

                    break;

                case asString:

                    (*(string*)pAddr) = d[m_listName[i].c_str()].GetString();

                    break;

                case asClass:

                    const rapidjson::Value &a=d[m_listName[i].c_str()];  //读取中文的数组

                    JsonHelper* j=static_cast<JsonHelper*>(pAddr);

                    j->DeSerializeValue(a);

                    break;

            }

        }

        return true;

    }

    return false;

}

这样,如果你有这样一个对象的数据

{\"MsgContent\":\"哈哈22\",\"MsgID\":1,\"MsgTitle\":\"测试\",\"object\": {\"a\": \"测试\",\"c\": \"测试\",\"e\": \"测试\"}}

就能根据绑定关系一个个解析出来了,然后到时候属性直接调用就好了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值