【教程】Cocos Sequence动画不执行CallFunc问题

感谢『简书ID: 不求甚解_b44d友情提供

http://www.jianshu.com/p/2552901b471f

使用Cocos的开发者越来越多,不仅国内受用,足迹还遍布了东南亚和欧美等海外国家。优越的性能和代码值得我们在项目开发工作中不断探索和研究。

最近,我在开发一个项目,我需要在场景中添加一个动画,并且在动画执行完毕后就移除它。

一般做法是这样的

先创建一个Animate:

e35a47a9722f6b00fd2f0f12cd054825.png

添加我们的回调函数

31e53a1b076f4c47443396615fcaad8a.png

最后写在一个序列中:

d010a259d9d18b3b0a060c9a2291b1df.png

上述动作完成了我们需要的功能,在完成动画之后将其移除,但我在调试时发现,这个节点经常还在场景中,并没有真正意义上的移除。我在回调的function中加了日志,日志也没有打印,说明压根就没回调。

为什么会这样?带着疑问首先我去看了下Cocos Sequence的源码。

下面简单分析下Sequence的实现逻辑
假设有这样一个序列:

3caf1f544cfeb418eae952bc4f5242d6.png

任务action 图1

我需要依次执行 1、2、3、4
看过Cocos Sequence源码的同学可能知道,一个Sequence其实只有两个action,如果需要大于两个action,需要用到多个Sequence来实现。也就是说,一个Sequence并不能完成4个串行动作。

Sequence初始化大于2个以上的action时会首先创建一个Sequence然后继续嵌套后面一个action,画图的效果类似这样:

af1988af4aa9d03a013c2591daef0b12.jpeg

实际的Sequence 图2

图2中最上面的Seq就是我们拿到手的Sequence,这样的执行顺序就是1->2->3->4。


好了,知道原理之后,我们的每个Sequence对自己的两个action时间做了分段,如果时间在前面的action时间段内,就执行action[0],否则执行action[1]。

每次传递的逝去时间也是经过百分比转换过的,然后多次浮点数计算之后导致的结果并不精确!

我在源码中加了日志:

bb9d71bb4532e9a7400daacdb4457d60.jpeg

增加日志 图3

实际打印结果跟我的预期一致:

aef3a43c3b447f18a3439e9c46cef4a3.png

打印日志 图4

看最后一行的输出,t是1.000000,_split也是1.000000,但是比较的结果却是true,就是t<_split成立,所以我们没有去找action[1],也就是我们的第二个动作,因此导致了我们的回调函数无法执行。

修改的方法很简单:c3c256eb9eed84d1c0db025cb7504235.png

加上一个精确值

OK,完美结束。

7cac464d85dbb8f9953cce97f0d044e1.gif

9ec94c15f973027d9602f89c274e27ef.gif

戳原文,更有料!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值