CocosBuilder 学习笔记(1) CCBReader 解析.ccbi文件流程
1. 简介
CocosBuilder是免费开源的Cocos2d UI编辑器。
.ccb文件是CCB项目的原始文件。
.ccbi文件是CCB项目发布后的生成的二进制文件。CCBReader可以快速通过该二进制文件,读取并设置CCB项目内容到引擎中。
.ccb文件是用map键值对的形式,保存了项目中所有Node的信息。
.ccbi文件是.ccb文件的精简,专门提供给CCBReader类进行解析。通过CCBReader,把项目中的Node和Node属性在引擎中新建Node并设置属性,从而把这些Node添加到Scene或Layer中。
2. 解析之前
NodeLoader
Node加载器。用于解析ccbi文件中和当前node相关内容,并把解析到的内容设置到node上,这样就让node加载成功了。不同的类有不同的属性,所以Node类和每个Node子类都有对应的Loader。
NodeLoaderLibrary
加载器的库。有map类型成员_nodeLoaders,存储Node类名和对应的Node加载器。在创建库时,默认新建了多个自带的Node类的加载器。也可以自行向库中添加自定义的类名和对应的自定义的加载器。
1. 首先创建库NodeLoaderLibrary,创建时为自带的Node和子类新建了加载器,并绑定加到库中。
2. 新建一个自定义layer子类的加载器,layer子类名和加载器绑定到库中。
3. 新建CCBRead对象,库作为CCBRead成员,绑定到其中。
有了所有Node类的加载器,就能对之后解析到的Node类名新建对象、对属性和值进行设置了。
接下来CCBReader开始解析.ccbi文件。
3. 解析时
通过.ccbi文件完整路径获取到文件二进制数据(Data类型)的指针。
CCBReader执行readNodeGraphFromData方法进行解析,参数:.ccbi数据指针,this(调用解析方法时的场景、层),屏幕size。该方法最终会返回一个layer,项目中所有node都是layer的子节点。我们将返回的这个layer添加到场景即可。
1. 解析文件头
文件头结构:

第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。之后将继续读取后面的内容。
2. 读取所有字符串,保存在CCBRead成员vector _stringCache中。
3. 解析动画序列Sequence。
获取Sequence总数,根据数量设置每个seq。
每个seq需要设置duration、name、Id、ChainedSequenceId。
每个seq的CallbackKeyframes不为空时,对每个keyframe设置time、value(callbackName callbackType),把keyframe加到seq的成员CallbackChannel的keyframes中,seq有SequenceProperty类型成员CallbackChannel。
每个seq的SoundKeyframes不为空时,对每个keyframe设置time、value(soundFile、pitch、pan、gain),把keyframe加到seq的成员SoundChannel的keyframes中,seq有SequenceProperty类型成员SoundChannel。
每个seq最后被加到animationManager成员Vector sequences中。
为animationManager设置成员autoPlaySequenceId。
4. 解析node。
执行readNodeGraph方法。
1. 从stringCache中获取类名。
2. 根据类名从库中找到对应的加载器。
3. 通过加载器新建类名对应的node对象。
4. 解析node相关的所有动画序列。
AnimationManager成员map nodeSequences的结构如下图:

node相关的动画序列内容最终都是被加到map seqs,和node一起被加到nodeSequences中。
一个node关联多个seq,我们把seqId作为seq识别标志。
每个seq有多个seqProp,解析时要设置seqProp的name、type。每个seqProp的name加到CCBReader成员set animatedProps中。
每个seqProp包含多个keyframe,读取并设置keyframe(time、easingType、easingOpt、value)。
5. 解析node相关属性。
需要node对应的加载器进行解析。执行加载器的parseProperties方法。
1. 获取属性数量。
2. 针对每个属性,获取属性类型、属性名、适用平台。
3. 根据每个属性的类型,调用加载器不同的解析属性值的方法,获取属性值。
4. 调用加载器的设置方法设置属性值。
5. 如有子节点,对子节点递归调用readNodeGraph方法。
CocosBuilder 学习笔记(1) CCBReader 解析.ccbi文件流程的更多相关文章
- CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析
[CocosBuilder]学习笔记目录 1. 相关的类 先介绍和AnimationManager相关的几个类: CCBSequence 时间线.有成员duration(时间线时间,默认10秒).na ...
- 【Android学习笔记】XmlResourceParser解析xml文件
最近学习Android时,需要用到解析XML文件里的数据,可以用XmlResourceParser来解析xml文件,正好将此记录下来. XmlResourceParser里常用的字段和方法 首先先给出 ...
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- LevelDB学习笔记 (3): 长文解析memtable、跳表和内存池Arena
LevelDB学习笔记 (3): 长文解析memtable.跳表和内存池Arena 1. MemTable的基本信息 我们前面说过leveldb的所有数据都会先写入memtable中,在leveldb ...
- CocosBuilder 学习笔记(2) .ccbi 文件结构分析
ccbi总体结构 CCBReader按字节读取.ccbi内容,每个字节8位二进制. .ccbi总体结构分为4个部分: Header 第0-3字节:ibcc .ccbi文件的标志.readHeader方 ...
- Webpack4 学习笔记五 图片解析、输出的文件划分目录
前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 webpack打包图片和划分文件路径 使用图片的方式 通过 new Image() 在 css中设置 background-imag ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- [Golang学习笔记] 02 命令源码文件
源码文件的三种类型: 命令源文件:可以直接运行的程序,可以不编译而使用命令“go run”启动.执行. 库源码文件 测试源码文件 面试题:命令源码文件的用途是什么,怎样编写它? 典型回答: 命令源码文 ...
- Javaweb学习笔记——使用Jdom解析xml
一.前言 Jdom是什么? Jdom是一个开源项目,基于树形结构,利用纯java的技术对XML文档实现解析,生成,序列化以及多种操作.它是直接为java编程服务,利用java语言的特性(方法重载,集合 ...
随机推荐
- 科密指纹考勤机B329采集
昨天项目用到了科密指纹考勤机B329. 暂记录下碰到的问题,及其解决办法,以备查询. 1.下载科密的二次开发包SDK“10079” .地址:( http://pan.baidu.com/s/1i39m ...
- 使用canvas来完成线性渐变和径向渐变的功能
fillStyle的第二种使用情况就是渐变色的填充.渐变色就分为线性渐变色和径向渐变色. 线性渐变:大致分为两步 这里又会使用到canvas的两个新的函数. 第一步 : 使用一个新的函数cre ...
- JDK(Windows)
百度云:链接:http://pan.baidu.com/s/1dEEsIUd 密码:15cn 官网下载网址:http://www.oracle.com/technetwork/java/jav ...
- 仿制shazzam的简单功能,将hlsl转换为WPF中的ShaderEffect
(此文章只是在对WPF的Effect产生兴趣才稍微研究了一点后面的知识;需要了解更多可参考https://archive.codeplex.com/?p=shazzam的源代码以及WPF基础知识) 1 ...
- HZOJ 单
两个子任务真的是坑……考试的时候想到了60分的算法,然而只拿到了20分(各种沙雕错,没救了……). 算法1: 对于测试点1,直接n遍dfs即可求出答案,复杂度O(n^2),然而还是有好多同学跑LCA/ ...
- [学习笔记] pymysql入门
一.快速开始 对于会用MySQL的朋友来说,开始使用pymysql可以说真的so esay,只要用下面的代码,把想要对数据库的操作放在 sql = " " 里就可以了. 没有接触过 ...
- 使用ASM实现动态代理
如果对我这段代码感兴趣,直接拷贝测试debug,要不然你不知道我写的是什么鬼,如果有什么问题,可以告诉我. 一.实现动态代理,首先得考虑有应该定义哪些类,根据JDK的动态代理思想,那么它就应该有一个生 ...
- 常用服务部署脚本(nodejs,pyenv,go,redis,)
根据工作总结的常用安装脚本,要求linux-64系统 #!/bin/bash path=/usr/local/src node () { cd $path #wget https://nodejs.o ...
- zabbix监控WEB网站性能
一直在纠结用什么实例来给大家演示呢?想来想去还是官方的好,那我们怎么用zabbix监控web性能和可用性呢?我们这边分为几个步骤:打开网站.登陆.登陆验证.退出,一共4个小step,看实例. 检测流程 ...
- .Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI)
前面已经介绍过了 .Net Core 程序发布到 Docker 容器的内容.但是每次通过 SSH 链接到服务器敲命令,运行脚本也是挺麻烦的一件事.程序员是最懒的,能让电脑解决的问题绝不手动解决,如果当 ...