ccbi总体结构

CCBReader按字节读取.ccbi内容,每个字节8位二进制。

.ccbi总体结构分为4个部分:

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

Header

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

第0-3字节:ibcc

.ccbi文件的标志。readHeader方法读取这四个字节,如果非ibcc说明非.ccbi文件,返回false停止继续读取。

第4字节:二进制表示的十进制12

版本号。readHeader方法在成功读取ibcc后,会读取该字节。为\f时,如果经过运算后得出5,符合当前版本要求.ccbi文件版本为5,可以继续读取。

第5字节:不为0时说明使用JS Controller,为0则不使用JS Controller

通过是否为0得出bool值,作为 CCBReader _jsControlled 和 _animationManager->_jsControlled。

至此,文件头读取完成,返回true。之后将继续读取后面的内容。

String Cache

执行readHeader方法读取文件头之后,执行readStringCache方法。该方法把项目使用的所有字符串保存在CCBReader成员std::vector<std::string> _stringCache中。

.ccbi文件中StringCache相关的部分,在开始两个字节记录了总的字符串的数量。之后每个字符串用“长度+内容”的形式记录。

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

可以看出,StringCache用于存储项目中使用到的所有字符串,包括自定义的属性名和string类型的属性值。

1

Animation Sequences

String Cache之后记录的是Animation Sequences。Sequences是animationManager的成员,animationManager是CCBReader的成员。先记录总的seq数量,之后记录其中包含的每个seq。

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

每个sequence内部结构:

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

值得注意的是,CCB官方文档里介绍的版本为4的.ccbi格式,对于sequence并不包含chainedSequenceId之后的内容,可以推测这些内容是在版本5新增的。

Node Graph

CCBRead通过readNodeGraph(Node * pParent)方法读取Node Graph。

首先从stringcache读取当前类名:

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

然后对当前node获取每个seqId,读取并设置seqProps:

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

map类型的seqs存储seqId和对应的Map seqNodeProps,seqNodeProps存储seqProp name和对应的seqProp。可以理解成,seqs存储seqId和对应的所有seqProp。

seqs和本node对应,当前node和生成的seqs被加入到animationManager里的map _nodeSequences。

读取并设置每个SequenceProperty:

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

刚才是设置node的动画序列,接下来设置node的属性。

CCBRead执行parseProperties(node, pParent, this)方法读取并设置属性。

先获取该node的属性总数,再依次读取并设置各个属性。‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

读取并设置属性的相关记录:

‎CocosBuilder 学习笔记(2) .ccbi 文件结构分析-LMLPHP

当前node的属性设置完成,接下来对子节点递归调用parseProperties方法,解析子节点的相关属性。

05-23 15:58