CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析
【CocosBuilder】学习笔记目录
1. 相关的类
先介绍和AnimationManager相关的几个类:
CCBSequence
时间线。有成员duration(时间线时间,默认10秒)、name(时间线名)、SequenceId(Id)、ChainedSequenceId(重复执行的时间线Id)、SequenceProperty* mCallbackChannel(关键帧执行回调)、SequenceProperty* mSoundChannel(关键帧执行Sound)。
CCBSequenceProperty
存储keyframe的容器。
有成员name、int type、Vector keyframes(存储关键帧keyframe)。
对于动画而言,Property的name是动画改变的属性的名字,例如position、rotation等。
CCBKeyframe
关键帧。CCB的动画是以关键帧为基础的,我们可以在时间线上设置关键帧,并为关键帧设置属性,CCB能够实现在关键帧之间实现动画。关键帧不仅可以用来设置动画属性,也能用于触发回调、声音。
有相关成员value(属性值)、time(发生的时间)、EasingType easingType(特效类型)、easingOpt(特效的值,部分特效有用)。
一个动画,需要关键帧才能呈现出动画效果。
2. 部分成员变量
CCBReader有成员animationManager,关联了一个动画管理器。还有成员Map<Node*, CCBAnimationManager*> animationManagers,将解析到的node和动画管理器关联。
AnimationManager是CCB项目中所有动画的管理中心。
成员Vector sequences,实际存储的是动画的时间线。
成员map<Node*, map<int, Map<string, SequenceProperty*>>> nodeSequences,其结构较复杂,用下图较为容易理解:
简而言之:
nodeSequences存储的是动画管理器管理的node和node对应的所有Property,Property存储关键帧,同一Property存储的关键帧是在同一变换(动画的属性、回调等)中起作用的。
node对应的Property按照Property所属的时间线(Sequence)Id进行分类。
3. 解析过程中 AnimationManager 相关操作
解析ccbi文件之前,设置成员rootContainerSize为屏幕大小,设置成员owner为this(执行CCBReader解析方法的场景或层)。
在解析ccbi文件时,执行CCBReader的readSequences方法解析时间线设置Sequence成员变量,每个时间线存储到容器sequences之中,并设置动画管理器成员autoPlaySequenceId,作为自动执行的时间线Id。
对于每个时间线,还可以设置CallbackChannel和SoundChannel,这两者都是SequenceProperty类型,在关键帧执行回调或声音。
接下来执行readNodeGraph方法,设置node相关的动画内容,并存储到容器nodeSequences之中。项目的根节点Layer作为成员rootNode。
.ccbi文件解析完成之后,把根节点Layer和动画管理器加入CCBReader成员容器animationManagers之中。
之后执行CCBReader关联的animationManager的runAnimationsForSequenceIdTweenDuration方法,参数:自动执行的时间线Id(解析文件时获取并设置的),0。
4. runAnimationsForSequenceIdTweenDuration 方法
就动画方面,readNodeGraph方法只是将动画需要的属性设置到了关键帧,并存储在动画管理器的容器中。真正将关键帧的动画属性转为实际的动画效果是依赖本方法。
1. 删除根节点Layer的所有action(removeAllActionsFromTarget)。
2. 遍历nodeSequences。对node删除所有action。获取当前node在当前时间线Id上的所有Property。
3. 遍历这些Property。对每个Property,先通过第一个关键帧设置初始状态。再设置动作序列。
动作序列设置流程:
1. Property内的关键帧数量最少为2。
2. 根据第一个关键帧的起始时间,设置延迟动作DelayTime。
3. 创建两帧之间的动作。两帧时间差作为动作时间,第二帧的状态作为动作结束时的状态。动作特效保存在第一帧,读取第一帧中的特效,对动作进行包装,得到新动作。
4. 还有帧的情况下,进行循环,帧下标+1,对此时两帧执行第三步(创建两帧的动作)。
5. 所有动作加入动作序列,对当前node执行动作序列(runAction)。
4. 获取当前时间线时间长度,根节点layer在时间线结束时,执行函数动作调用函数AnimationManager::sequenceCompleted。
回调函数是在时间线结束后,可以通过ChainedSequenceId,设置并执行要重复执行的时间线。
5. 通过CallbackChannel的关键帧,生成一个回调函数动作序列,根节点Layer执行该动作序列(runAction)。
6. 通过SoundChannel的关键帧,生成一个声音动作序列,根节点Layer执行该动作序列(runAction)。
7. 此时的时间线Id作为runningSequence。在时间线运行结束后调用的sequenceCompleted方法会获取该值,用来获取当前时间线,从而设置下一时间线id并执行下一时间线。
5. 总结
CCB动画的实质是多个动作的组合。
在解析ccbi文件NodeGraph后,时间线和动画相关内容已经全部读取完成,并存储到了相应的容器里。接下来就要根据容器内动画相关内容,设置动作,并交给对应的node执行动作。
node的动画信息(关键帧)是由SequenceProperty存储,通过AnimationManager的容器关联Node和Property。
node可能在多个时间线有动画,所以要通过时间线Id给Node的Property进行分类。
Sequence仅作为时间线使用。时间线也有Property,其中的关键帧作为触发回调函数或声音使用。
CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析的更多相关文章
- Java NIO 学习笔记(六)----异步文件通道 AsynchronousFileChannel
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- CocosBuilder 学习笔记(1) CCBReader 解析.ccbi文件流程
1. 简介 CocosBuilder是免费开源的Cocos2d UI编辑器. .ccb文件是CCB项目的原始文件. .ccbi文件是CCB项目发布后的生成的二进制文件.CCBReader可以快速通过该 ...
- CocosBuilder 学习笔记(2) .ccbi 文件结构分析
ccbi总体结构 CCBReader按字节读取.ccbi内容,每个字节8位二进制. .ccbi总体结构分为4个部分: Header 第0-3字节:ibcc .ccbi文件的标志.readHeader方 ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
- Linux学习笔记14——使用fcntl实现文件锁定
期末考试快要来了,Linux学习进度一下拉下来许多.今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf.下面主要是fcntl的调用. fcntl函数的原型是:in ...
- [Golang学习笔记] 02 命令源码文件
源码文件的三种类型: 命令源文件:可以直接运行的程序,可以不编译而使用命令“go run”启动.执行. 库源码文件 测试源码文件 面试题:命令源码文件的用途是什么,怎样编写它? 典型回答: 命令源码文 ...
- 批处理学习笔记14 - 把所有.mp4文件全部拷贝进统一目录
今天下载了一套视频教程,结果发现不在同一个目录下,很乱.都放在不同文件夹下. 于是写了一个批处理来解决这个问题 @echo off for /r %%i in (*mp4) do ( copy %%i ...
- [Golang学习笔记] 03 库源码文件
库源码文件:不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用. 代码包声明的基本规则: 1. 同目录下的源码文件的代码包声明语句要一致.也就是说,它们要同属于一个代码包( ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
随机推荐
- 二十、Sql Server 保留几位小数的两种做法
问题: 数据库里的 float momey 类型,都会精确到多位小数.但有时候 我们不需要那么精确,例如,只精确到两位有效数字. 解决: 1. 使用 Round() 函数,如 Round(@num,2 ...
- MetInfo企业网站管理系统 5.3 全新安装
在phpStudy\PHPTutorial\WWW的文件下创建MetInfo文件夹.把MetInfo5.3解压到MetInfo文件夹里 用浏览器访问127.0.0.1/MetInfo 同意安装 下一步 ...
- C语言编程入门之--第二章编译环境搭建
第二章 编译环境搭建 导读:C语言程序如何工作,首先需要编译链接成可执行文件,然后就可以运行在不同的环境中,这个“环境”的意思就是比如说,电脑,手机,路由器,蓝牙音箱等等智能设备中,其中编译器启到了关 ...
- Java类什么情况下被初始化?
1.创建类的实例(new 的方式).访问某个类或接口的静态变量,或者对该静态变量赋值,调用类的静态方法 2.反射的方式 3.当初始化一个类的时候,如果发现其父类还没有进行初始化,则需先触发其父类的初始 ...
- win10下nodejs的安装及配置
这里主要引用两篇文章,写的非常详细,也能解决你可能出现的问题 nodejs安装及配置 如何删除之前nodejs设置的 npm config set prefix .....
- Docker 容器基本操作[Docker 系列-2]
Docker 入门及安装[Docker 系列-1] 镜像就像是一个安装程序,而容器则是程序运行时的一个状态. 查看容器 查看容器 启动 docker 后,使用 docker ps 命令可以查看当前正 ...
- 有容云:上车 | 听老司机谈Docker安全合规建设
编者注: 本文根据7月19日DockOne社群分享内容整理而成,分享嘉宾蒋运龙,有容云高级咨询顾问,一个IT的老兵,十年来混迹于存储.三网融合.多屏互动.智能穿戴.第三方支付.Docker等行业:经历 ...
- Java的几种常见排序算法
一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...
- RGW 学习 前言
对于CEPH的学习已经有一段的时间了,最近的一段时间都是集中在RGW网关这一方面,所以准备将学习的过程以及源代码的分析,将以随笔的形式记录下来. 每天更新一章.
- 夯实Java基础(七)——Static关键字
1.static介绍 static关键字一直是各大企业中面试常常会问到的问题,主要考察面试者的基础是否扎实,下面来介绍一下static关键字. Java中static表示“全局”或者“静态”的意思,可 ...