转自:blog.csdn.net/eduwc/article/details/9926681
我们接着上文说,看看是如何处理json文件数据的
bool
Reader::readValue()
{
Token token;
skipCommentTokens( token );
bool successful = true;
if ( collectComments_ && !commentsBefore_.empty() )
{
currentValue().setComment( commentsBefore_, commentBefore );
commentsBefore_ = "";
}
//来根据不同的类型做不同的处理 来组织数据结构 到时候就方便大家使用了啊(有兴趣的同学
可以深入到每种类型的解析过程中去看看 主要就是解析完之后 用Nodes nodes_组织起来)
switch ( token.type_ )
{
case tokenObjectBegin:
successful = readObject( token );
break;
case tokenArrayBegin:
successful = readArray( token );
break;
case tokenNumber:
successful = decodeNumber( token );
break;
case tokenString:
successful = decodeString( token );
break;
case tokenTrue:
currentValue() = true;
break;
case tokenFalse:
currentValue() = false;
break;
case tokenNull:
currentValue() = Value();
break;
default:
return addError( "Syntax error: value, object or array expected.", token );
}
if ( collectComments_ )
{
lastValueEnd_ = current_;
lastValue_ = ¤tValue();
}
return successful;
}
解析
1. 用来跳过特殊符号 token.type_
type_的类型有如下这些
enum TokenType
{
tokenEndOfStream = 0,//结束符
tokenObjectBegin,//对象开始,就是{
tokenObjectEnd,//对象的结束,就是}
tokenArrayBegin,//数组的开始,就是[
tokenArrayEnd,//数组的结束,就是]
tokenString,//处理字符创
tokenNumber,//处理数字
tokenTrue,//处理bool类型 true
tokenFalse,//处理bool类型 false
tokenNull,//是否是空
tokenArraySeparator,//处理数组分割
tokenMemberSeparator,//处理数字分割
tokenComment,//处理注释
tokenError//处理错误
};
2.
switch ( token.type_ )
{
....
..
}
上面就是来根据不同的类型做不同的处理 来组织数据结构 到时候就方便大家使用了啊(有兴趣的同学
可以深入到每种类型的解析过程中去看看 主要就是解析完之后 用Nodes nodes_组织起来)
--------------------------------------------------------------华丽的分割线------------------------------------------------------------------------
我们在回过头来看看cocostudio又是如何把解析好的Json 数据组织起来的
我们回到addDataFromJsonCache
我们来看看是如何组织armature_data的数据的
跳(4)
//组织骨骼的数据
// Decode armatures
int length = json.getArrayItemCount(ARMATURE_DATA); //获取到armature_data的Json数据
for (int i = 0; i<length; i++)
{
//获取每一个节点的数据
CSJsonDictionary *armatureDic = json.getSubItemFromArray(ARMATURE_DATA, i);
//获取到骨骼数据 可以查看动作编辑器导出来的Json中的bone_data数据
ArmatureData *armatureData = decodeArmature(*armatureDic);
//把骨骼动画数据添加到ArmatureDataManager这个数据管理类里面,以后想使用的时候,直接就能用了
ArmatureDataManager::sharedArmatureDataManager()->addArmatureData(armatureData->name.c_str(), armatureData);
}
//组织动作的数据
length = json.getArrayItemCount(ANIMATION_DATA);
for (int i = 0; i<length; i++)
{
CSJsonDictionary *animationDic = json.getSubItemFromArray(ANIMATION_DATA, i);
AnimationData *animationData = decodeAnimation(*animationDic);
ArmatureDataManager::sharedArmatureDataManager()->addAnimationData(animationData->name.c_str(), animationData);
}
//组织纹理的数据
length = json.getArrayItemCount(TEXTURE_DATA);
for (int i = 0; i<length; i++)
{
CSJsonDictionary *textureDic = json.getSubItemFromArray(TEXTURE_DATA, i);
TextureData *textureData = decodeTexture(*textureDic);
ArmatureDataManager::sharedArmatureDataManager()->addTextureData(textureData->name.c_str(), textureData);
}
--------------------------------------------------------------华丽的分割线------------------------------------------------------------------------
好了 至此已经向大家展示了,从数据读入到最后的数据结构生成的全部流程。剩下的就是就是方便的使用了
举个例子:
cs::Armature *pArmature =NULL;
pArmature =cs::Armature::create("NewProject");//读取Armature_data
pArmature->getAnimation()->playByIndex(0); //播放第几个动作
pArmature->setPosition(VisibleRect::center());
addChild(pArmature);