感谢『简书ID: 不求甚解_b44d』友情提供
http://www.jianshu.com/p/2552901b471f
使用Cocos的开发者越来越多,不仅国内受用,足迹还遍布了东南亚和欧美等海外国家。优越的性能和代码值得我们在项目开发工作中不断探索和研究。
最近,我在开发一个项目,我需要在场景中添加一个动画,并且在动画执行完毕后就移除它。
一般做法是这样的
先创建一个Animate:
添加我们的回调函数
最后写在一个序列中:
上述动作完成了我们需要的功能,在完成动画之后将其移除,但我在调试时发现,这个节点经常还在场景中,并没有真正意义上的移除。我在回调的function中加了日志,日志也没有打印,说明压根就没回调。
为什么会这样?带着疑问首先我去看了下Cocos Sequence的源码。
下面简单分析下Sequence的实现逻辑
假设有这样一个序列:
任务action 图1
我需要依次执行 1、2、3、4
看过Cocos Sequence源码的同学可能知道,一个Sequence其实只有两个action,如果需要大于两个action,需要用到多个Sequence来实现。也就是说,一个Sequence并不能完成4个串行动作。
Sequence初始化大于2个以上的action时会首先创建一个Sequence然后继续嵌套后面一个action,画图的效果类似这样:
实际的Sequence 图2
图2中最上面的Seq就是我们拿到手的Sequence,这样的执行顺序就是1->2->3->4。
好了,知道原理之后,我们的每个Sequence对自己的两个action时间做了分段,如果时间在前面的action时间段内,就执行action[0],否则执行action[1]。
每次传递的逝去时间也是经过百分比转换过的,然后多次浮点数计算之后导致的结果并不精确!
我在源码中加了日志:
增加日志 图3
实际打印结果跟我的预期一致:
打印日志 图4
看最后一行的输出,t是1.000000,_split也是1.000000,但是比较的结果却是true,就是t<_split成立,所以我们没有去找action[1],也就是我们的第二个动作,因此导致了我们的回调函数无法执行。
修改的方法很简单:
加上一个精确值
OK,完美结束。
戳原文,更有料!