深度解析cocostudio是如何处理动作编辑器导出来的Json文件(2) (转)


转自: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_ = &currentValue();
   }

   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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值