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 animationManagers,将解析到的node和动画管理器关联。

AnimationManager是CCB项目中所有动画的管理中心。

成员Vector sequences,实际存储的是动画的时间线。

成员map>> 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,其中的关键帧作为触发回调函数或声音使用。

cocos2d 解密ccbi_CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析相关推荐

  1. C# 学习笔记(12)hex文件转bin文件小工具

    C# 学习笔记(12)hex文件转bin文件小工具 hex文件格式 hex文件格式网上有很多 我这里参考HEX文件格式详解https://blog.csdn.net/weixin_39752827/a ...

  2. Liunx学习笔记 - 07 - 02 正则表达式与文件格式化处理

    Liunx学习笔记 - 07 - 02 正则表达式与文件格式化处理 1 前言:啥是正则表达式 简单来讲,正则表达式是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的 ...

  3. Linux学习笔记(七):文件压缩、打包与备份

    Linux学习笔记(七):文件压缩.打包与备份 常见的压缩指令 gzip, zcat/zmore/zless/zgrep bzip2, bzcat/bzmore/bzless/bzgrep xz, x ...

  4. oracle rac 环境配置文件,学习笔记:Oracle RAC spfile参数文件配置案例详解

    天萃荷净 rac中的spfile探讨,记录一下Oracle RAC搭建完成后关于spfile参数文件的配置案例,与更改RAC环境中参数文件的方法 今天朋友的的rac,因为被同事做数据库升级,分别在两个 ...

  5. 20190328学习笔记 - JSP 中的 tag 文件

    20190328学习笔记 - JSP 中的 tag 文件 对于tag 文件 1. 引入 tag 文件 2. 在/WEB-INF/tags/sys 下,新增一个gridselect.tag文件 3. 在 ...

  6. DSP学习(8)—— linker.cmd文件解析

    DSP学习(8)-- linker.cmd文件解析 文章目录 DSP学习(8)-- linker.cmd文件解析 前言 前言 写工程的时候遇到报内存不够的错误,出现在linker.cmd的内存分配se ...

  7. cocos2d 解密ccbi_cocosBuilder使用总结

    原创,转载请注明出处! 基本流程 >=-. 准备工作 #. 把一个项目场景相关的,相对独立(别的场景用不到)的碎图,用TexturePack拼接成大的png图片文件及plist数据字处理文件 # ...

  8. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  9. Linux学习笔记---使用tftp命令下载文件

    向开发板下载数据时,不仅可以通过nfs命令下载,还可以通过更简单的命令tftp下载. 用网线将开发板和笔记本连接起来,设置好网络环境.网络的具体设置方法可以参考 Linux学习笔记---网线直连电脑和 ...

  10. deepstream学习笔记(三):deepstream-imagedata-multistream解析与接入适配yolov5模型测试

    引言 上一节重点介绍了gstreamer架构图与各部分组成原理说明,并且针对deepstream-test1介绍了它的整体功能和画出了管道图,本篇博文将详细介绍deepstream-imagedata ...

最新文章

  1. ggplot2笔记4 语法基础
  2. Fast implementation/approximation of pow() function in C/C++
  3. 《算法》学习笔记2.1 初级排序算法
  4. Android中实现SQLite数据库CRUD操作的两种方式
  5. 伪代码书写规范_C++代码书写规范(推荐新手程序员)
  6. bool转nsnumber ios_iOS开发之NSDecimalNumber的使用,货币计算/精确数值计算/保留位数等...
  7. 收藏 | 深度学习图像分类任务中那些不得不看的技巧总结
  8. 掌趣科技登榜2019中国品牌出海新秀50强 全球化战略持续发力
  9. 实时查看磁盘inode和block变化
  10. linux git添加密钥,centos – 无法在Gitlab上创建项目或添加ssh密钥
  11. 练习--第一次课(运算if while 字符编码)
  12. SQLServer启动和关闭bat脚本
  13. js html 导出excel文件,js 导出excel ,elsx格式
  14. 谷歌眼镜公开接受预订,全新宣传视频帅爆了_-Chaz-_新浪博客
  15. linux中项目常用的start.sh和stop.sh
  16. python存储JSON
  17. springboot热启动与热部署
  18. PHP 正则判断是否是手机号码
  19. java写response实现文件下载
  20. Tick 数据在技术上究竟是什么东西?

热门文章

  1. 正则表达式常用匹配方式
  2. Dymola — 多学科系统仿真平台
  3. 基于SSM框架的公交车调度管理系统
  4. IDEA怎么设置背景图片
  5. python将npy文件转换成图片
  6. jupyter lab 导出笔记为pdf
  7. AUTOCAD——超级填充
  8. 【Java面试题】这道分布式面试题一定要拿下,说说你对CAP的理解?看看高手如何回答
  9. 生成VOC2012数据集
  10. 人体呼吸感应雷达技术,智能雷达传感器,智能化感知雷达应用