1. Sequence

动作序列。动作按参数顺序执行,动作总时长为每个动作的时长之和。

1.1 成员变量

  1. FiniteTimeAction *_actions[];
  2. float _split; // 第一个action在Sequence的时间占比
  3. int _last;

1.2 create方法

4种:

  1. createWithTwoActions(FiniteTimeAction *actionOne, FiniteTimeAction *actionTwo) // 用两个action创建
  2. create(FiniteTimeAction *action1, ...) // 用很多action创建,调用下面的方法
  3. createWithVariableList(FiniteTimeAction *action1, va_list args)
  4. create(const Vector<FiniteTimeAction*>& arrayOfActions) // 存储action的Vector容器作为参数

createWithTwoActions:

调用initWithTwoActions方法,两个action的时间之和作为Sequence的duration,并对两个action retain()。

createWithVariableList:

调用了createWithTwoActions方法,参数第一个action为参数action,参数第二个action为va_list args存储的变长参数。当只有一个action时,createWithTwoActions的第二个参数为ExtraAction。

  1. Sequence* Sequence::createWithVariableList(FiniteTimeAction *action1, va_list args)
  2. {
  3. FiniteTimeAction *now;
  4. FiniteTimeAction *prev = action1;
  5. bool bOneAction = true;
  6.  
  7. while (action1)
  8. {
  9. now = va_arg(args, FiniteTimeAction*);
  10. if (now)
  11. {
  12. prev = createWithTwoActions(prev, now);
  13. bOneAction = false;
  14. }
  15. else
  16. {
  17. // If only one action is added to Sequence, make up a Sequence by adding a simplest finite time action.
  18. if (bOneAction)
  19. {
  20. prev = createWithTwoActions(prev, ExtraAction::create());
  21. }
  22. break;
  23. }
  24. }
  25.  
  26. return ((Sequence*)prev);
  27. }

create:

使用Vector存储action,调用init方法,递归地创建Sequence。

s1=a1+a2 s2=a3+s1 s3=a4+s2 s4=a5+s3 ... 最终获得的Sequence是一个action和sequence的组合。

1.3 startWithTarget

runAction时调用。

  1. if (_duration > FLT_EPSILON)
  2. _split = _actions[]->getDuration() > FLT_EPSILON ? _actions[]->getDuration() / _duration : ;
  3.  
  4. ActionInterval::startWithTarget(target);
    _last = -1;

_duration和action的duration要大于精度值FLT_EPSILON,第一个action的设置时间与序列总时间的商是_split,代表第一个action在序列上的时间占比。

_last是上次序列update时执行的action下标,0或1,-1代表还未update。

1.4 update

简而言之,update通过当前进度判断要执行哪个action,先计算好这个action的本次进度。如果本次是第一次执行第二个action,要先把第一个action update执行完成。接下来,执行这次的action update,执行后保存这次执行的下标,供下一帧判断。

Sequence对嵌套其中的Sequence递归执行startWithTarget和update。递归退出的条件是found == _last && _actions[found]->isDone(),即最后一个action执行完成。

  1. void Sequence::update(float t)
  2. {
  3. int found = ; // 当前action下标
  4. float new_t = 0.0f; // 当前action进度
  5.  
  6. if( t < _split ) // 正在执行第一个action
  7. {
  8. // action[0]
  9. found = ; // 改变下标
  10. if( _split != ) // 第一个action设置的时间不为0
  11. new_t = t / _split; // 计算第一个action进度
  12. else
  13. new_t = ; // 第一个action设置的时间为0,则完成第一个action
  14.  
  15. }
  16. else // 正在执行第二个action
  17. {
  18. // action[1]
  19. found = ; // 改变下标
  20. if ( _split == ) // 第二个action时间为0时
  21. new_t = ; // 完成第二个action
  22. else
  23. new_t = (t-_split) / ( - _split ); // 计算第二个action进度
  24. }
  25.  
  26. if ( found== ) // 正在执行第二个Action
  27. {
  28. if( _last == - ) // 如果上一次update没有执行第一个action
  29. {
  30. // action[0] was skipped, execute it.
  31. _actions[]->startWithTarget(_target); // 初始化第一个action
  32. if (!(sendUpdateEventToScript(1.0f, _actions[])))
  33. _actions[]->update(1.0f); // 直接完成第一个action
  34. _actions[]->stop();
  35. }
  36. else if( _last == ) // 上次update执行的是第一个action,本次update执行第二个,说明第一个执行完成
  37. {
  38. // switching to action 1. stop action 0.
  39. if (!(sendUpdateEventToScript(1.0f, _actions[])))
  40. _actions[]->update(1.0f); // 让第一个执行完成
  41. _actions[]->stop();
  42. }
  43. }
  44. else if(found== && _last== ) // 基本不会发生的情况
  45. {
  46. // Reverse mode ?
  47. // FIXME: Bug. this case doesn't contemplate when _last==-1, found=0 and in "reverse mode"
  48. // since it will require a hack to know if an action is on reverse mode or not.
  49. // "step" should be overridden, and the "reverseMode" value propagated to inner Sequences.
  50. if (!(sendUpdateEventToScript(, _actions[])))
  51. _actions[]->update();
  52. _actions[]->stop();
  53. }
  54. // Last action found and it is done.
  55. if( found == _last && _actions[found]->isDone() )
  56. {
  57. return;
  58. }
  59.  
  60. if( found != _last ) // 正常执行到新的action
  61. {
  62. _actions[found]->startWithTarget(_target); // 新action初始化
  63. }
  64. if (!(sendUpdateEventToScript(new_t, _actions[found])))
  65. _actions[found]->update(new_t); // 执行
  66. _last = found; // 记录这次执行的action下标
  67. }

Cocos2d-x 学习笔记(11.6) Sequence的更多相关文章

  1. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  2. SQL反模式学习笔记11 限定列的有效值

    目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...

  3. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

  4. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  5. Python3+Selenium3+webdriver学习笔记11(cookie处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...

  6. 并发编程学习笔记(11)----FutureTask的使用及实现

    1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...

  7. 《C++ Primer Plus》学习笔记11

    <C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...

  8. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  9. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

随机推荐

  1. error LNK1104: 无法打开文件“opencv_world331.lib” LINK : fatal error LNK1104: 无法打开文件“opencv_world331.lib”,程序报这个错误时应该怎么解决?

    这几天被这个错误搞得很头大,看了很多大神的解决办法,涉及到opencv的版本的windows的操作系统等各种知识,但是我尝试了很多办法最终都没有解决.今天晚上突然想到之前遇到这种无法打开lib文件时, ...

  2. python time.striptime模块用法

    python time模块中strptime用法 time.strptime(string[, format]) 其中string参数即为要深入的日期字符串.format为格式化的日期字符串. %Y ...

  3. py-faster-rcnn的常见错误

    在py-faster-rcnn配置运行faster-rcnn-end2end-VGG-CNN_M_1024的过程中, 执行命令:./experiments/scripts/faster_rcnn_en ...

  4. Matlab 模拟退火算法模型代码

    function [best_solution,best_fit,iter] = mySa(solution,a,t0,tf,Markov) % 模拟退化算法 % ===== 输入 ======% % ...

  5. SVN更改地址

    因为服务器更改或其他某些原因导致svn地址改变,那么本地应该如何操作tortoiseSVN?如何成功的把项目进行迁移? 操作步骤 1.右击项目目录---TortoiseSVN----重新定位(英文版是 ...

  6. Python-进程相关概念

    名词解释: 进程: 一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位 1. 并行 在某个*时间点*,两件或两件以上的事件(任务)同时执行. 比如说,有三 ...

  7. Kafka系列一之架构介绍和安装

    Kafka架构介绍和安装 写在前面 还是那句话,当你学习一个新的东西之前,你总得知道这个东西是什么?这个东西可以用来做什么?然后你才会去学习它,使用它.简单来说,kafka既是一个消息队列,如今,它也 ...

  8. 23种设计模式之责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...

  9. 链表-LinkList

    什么是链表 维基百科:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存 ...

  10. 阿里云服务器CentOS6.9 nexus私服使用

    exus安装成功之后,我们开始使用. 登录nexus: 访问地址:http:ip地址:8081/nexus 默认登录账号:admin 密码:admin123 登录成功之后页面: 点击[Reposito ...