Cocos2d-x3.1 Json解析

本文介绍了一个使用Cocos2d-x引擎读取JSON文件并解析数据的过程。该过程涉及了C++代码中如何利用rapidjson库进行JSON数据的加载、解析及遍历等操作。此外,还展示了如何从JSON中提取具体属性值并应用到游戏世界中的实例。


#include "json/document.h"  


rapidjson::Document d1;   
 std::string jsonpath = FileUtils::getInstance()->fullPathForFilename(gate.c_str());
 std::string contentStr = FileUtils::getInstance()->getStringFromFile(jsonpath);
 d1.Parse<0>(contentStr.c_str());  int tag = 0;
std::string path = ""; 
const char *className = DICTOOL->getStringValue_json(d1, "classname");
    if(strcmp(className, "CCNode") == 0)
    {
	
		int count = DICTOOL->getArrayCount_json(d1, "gameobjects");
		 for (int i = 0; i < count; i++)
        {
            const rapidjson::Value &subDict = DICTOOL->getSubDictionary_json(d1, "gameobjects", i);
            if (!DICTOOL->checkObjectExist_json(subDict))
            {
                break;
            }
            
            const char *comName = DICTOOL->getStringValue_json(subDict, "classname");
			tag = DICTOOL->getIntValue_json(subDict, "objecttag");
			if(tag == Json_root  ){
                float x = DICTOOL->getFloatValue_json(subDict, "x");
                float y = DICTOOL->getFloatValue_json(subDict, "y");
                Point rooxy = Point(x,y);
                this->gateEdit(tag, subDict,  rooxy);
				int countj = DICTOOL->getArrayCount_json(subDict, "gameobjects");
				for (int j=0; j < countj; j++){
					const rapidjson::Value &subDictnode = DICTOOL->getSubDictionary_json(subDict, "gameobjects", j);
					if (!DICTOOL->checkObjectExist_json(subDictnode))
					{
						break;
					}
                    tag = DICTOOL->getIntValue_json(subDictnode, "objecttag");
                    this->gateEdit(tag, subDictnode,rooxy);

				}
				

			}
			
        }


	}




{
    "entities": [
        {
            "entity": {
                "TapOpposite": 0, 
                "Interval": 0.95, 
                "BallNum": 1
            }
        }, 
        {
            "entity": {
                "TapOpposite": 0, 
                "Interval": 0.91, 
                "BallNum": 2
            }
        }, 
        {
            "entity": {
                "TapOpposite": 0, 
                "Interval": 0.95, 
                "BallNum": 3
            }
        }
    ]
}



void GameWorld::readJson()
{
	//json 文档
	rapidjson::Document _doc;
	bool bRet = false;
	ssize_t size = 0;
	unsigned char *pBytes = NULL;
	do {
		pBytes = cocos2d::CCFileUtils::sharedFileUtils()->getFileData("ball.json", "r", &size);
		CC_BREAK_IF(pBytes == NULL || strcmp((char*)pBytes, "") == 0);
		std::string load_str((const char*)pBytes, size);
		CC_SAFE_DELETE_ARRAY(pBytes);
		_doc.Parse<0>(load_str.c_str());
		CC_BREAK_IF(_doc.HasParseError());			
		//生成json文档对像

		if(!_doc.IsObject())
			return;

		//是否有此成员
		if(!_doc.HasMember("entities"))
			return;

		// 通过[]取成员值,再根据需要转为array,int,double,string
		const rapidjson::Value &pArray = _doc["entities"];

		//是否是数组
		if(!pArray.IsArray())
			return;

		for (rapidjson::SizeType i = 0; i < pArray.Size(); i++)
		{
			const rapidjson::Value &p = pArray[i];				
			if(p.HasMember("entity"))
			{
				const rapidjson::Value &valueEnt = p["entity"];
				if(valueEnt.HasMember("TapOpposite") && valueEnt.HasMember("Interval") && valueEnt.HasMember("BallNum"))
				{
					const rapidjson::Value &tapOpposite = valueEnt["TapOpposite"];
					int tapOp = tapOpposite.GetInt();      //得到int值

					const rapidjson::Value &interval = valueEnt["Interval"];
					float inter = interval.GetDouble();  //得到float,double值

					const rapidjson::Value &ballNum = valueEnt["BallNum"];
					int ball = ballNum.GetInt();      //得到int值

					ballParam param;
					param.tapOp = tapOp;
					param.inter = inter;
					param.ballIndex = ball;
					m_ballParamVec.push_back(param);
				}
			}
			else
			{
				return;
			}

		}
		bRet = true;

	} while (0);
}



转载于:https://my.oschina.net/ffs/blog/287422

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值