CocosBuilder 学习笔记(2) .ccbi 文件结构分析
ccbi总体结构
CCBReader按字节读取.ccbi内容,每个字节8位二进制。
.ccbi总体结构分为4个部分:

Header

第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相关的部分,在开始两个字节记录了总的字符串的数量。之后每个字符串用“长度+内容”的形式记录。

可以看出,StringCache用于存储项目中使用到的所有字符串,包括自定义的属性名和string类型的属性值。
1
Animation Sequences
String Cache之后记录的是Animation Sequences。Sequences是animationManager的成员,animationManager是CCBReader的成员。先记录总的seq数量,之后记录其中包含的每个seq。

每个sequence内部结构:

值得注意的是,CCB官方文档里介绍的版本为4的.ccbi格式,对于sequence并不包含chainedSequenceId之后的内容,可以推测这些内容是在版本5新增的。
Node Graph
CCBRead通过readNodeGraph(Node * pParent)方法读取Node Graph。
首先从stringcache读取当前类名:

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

map类型的seqs存储seqId和对应的Map seqNodeProps,seqNodeProps存储seqProp name和对应的seqProp。可以理解成,seqs存储seqId和对应的所有seqProp。
seqs和本node对应,当前node和生成的seqs被加入到animationManager里的map _nodeSequences。
读取并设置每个SequenceProperty:

刚才是设置node的动画序列,接下来设置node的属性。
CCBRead执行parseProperties(node, pParent, this)方法读取并设置属性。
先获取该node的属性总数,再依次读取并设置各个属性。
读取并设置属性的相关记录:

当前node的属性设置完成,接下来对子节点递归调用parseProperties方法,解析子节点的相关属性。
CocosBuilder 学习笔记(2) .ccbi 文件结构分析的更多相关文章
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- thinkphp学习笔记2—入口文件
原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...
- matlab学习笔记5--低级文件输入输出函数
一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析
[CocosBuilder]学习笔记目录 1. 相关的类 先介绍和AnimationManager相关的几个类: CCBSequence 时间线.有成员duration(时间线时间,默认10秒).na ...
- CocosBuilder 学习笔记(1) CCBReader 解析.ccbi文件流程
1. 简介 CocosBuilder是免费开源的Cocos2d UI编辑器. .ccb文件是CCB项目的原始文件. .ccbi文件是CCB项目发布后的生成的二进制文件.CCBReader可以快速通过该 ...
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Windows phone 8 学习笔记(2) 数据文件操作(转)
Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
- Python学习笔记之从文件中读取数据
10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...
随机推荐
- Sublime 常用插件及配置
一.把 tab 键修改转换成4个空格 1. 在菜单里选择 Preferences --> Settings 2. 在弹出来的设置面板选择右侧 --User,添加两行代码: "trans ...
- Python基础总结之第一天(新手可相互督促)
我是大刘啊~ 坚持每周更新最少一次,为年薪20万迈进! 我为什么要学Python? 答:我想要涨工资...家里有矿我就不会来烧脑了...... 先写点什么呢? 新手,hhh,激动无比,无从下爪.... ...
- linux基础命令期末考试总结
1.关闭防火墙:service iptables stop 2.启动防火墙:service iptables start 3.mount命令:挂载某一设备使之成为某个目录名称 4.NFS服务:linu ...
- golang在多个go routine中进行map或者slice操作应该注意的对象。
因为golang的map和列表切片都是引用类型,且非线程安全的,所以在多个go routine中进行读写操作的时候,会产生“map read and map write“的panic错误. 某一些类型 ...
- Spring Cloud 之 Gateway.
一.Gateway 和 Zuul 的区别 Zuul 基于servlet 2.5 (works with 3.x),使用阻塞API.它不支持任何长期的连接,如websocket. Gateway建立在S ...
- bitset的简单用法
1.头文件 #include<bitset> 2.基本操作 bitset<n> b; b有n位,每位都为0. 参数n可以为一个表达式.如bitset<5> b, 则 ...
- HTML&CSS兼容性总结
对目前所遇见的兼容性笔记进行整理分类: 不兼容浏览器 问题概要 问题描述 解决方法 IE6,IE7 3px 并列一行的元素左侧第一个元素没浮动,第二个元素左浮动,则两个元素之间会多3像素空隙 并在一 ...
- C#文件操作 File(静态类)
操作某一个文件/文件夹,需要一个文件的完整路径 一.使用File的静态方法进行文件操作 1 2 3 4 5 6 7 8 9 //使用file的静态方法进行复制 File.C ...
- memcached.c 源码分析
上文分析了memcached的autoconf过程以及configure, make过程,可以看到,memcached可执行文件是由memcached-memcached.o以及其他文件连接后编译出来 ...
- go杂货铺
json序列化 内存中变成可存储或传输的过程称之为序列化(dict,split,struct转string) package main import ( "encoding/json&quo ...