cocos的坑還是很多的惦辛,但是人家的代碼確實(shí)還可以尘奏,性能上不錯(cuò)拓诸,所以我們需要慢慢優(yōu)化它吐句,填坑瞳步。
在項(xiàng)目中碰到這樣的一個(gè)情況撩匕,我需要在場(chǎng)景中添加一個(gè)動(dòng)畫(huà)赢乓,并且在動(dòng)畫(huà)執(zhí)行完畢后就移除它妹萨。
我們一般的做法:
先創(chuàng)建一個(gè)Animate:
local animation = cc.Animation:create()
for i=1,5 do
name = "p"..i..".png"
animation:addSpriteFrameWithFile(name)
end
local animate = cc.Animate:create(animation)
添加我們的回調(diào)函數(shù)
local callback = cc.CallFunc:create(function() self:removeFromParent(true) end)
最后寫(xiě)在一個(gè)序列中:
local seq = cc.Sequence:create({animate,callback})
self:runAction(seq)
上面完成了我們需要的功能谤饭,在完成我們的動(dòng)畫(huà)之后移除标捺,但是我在調(diào)試的時(shí)候發(fā)現(xiàn),經(jīng)常這個(gè)節(jié)點(diǎn)還在場(chǎng)景中揉抵,并沒(méi)有移除亡容,我在回調(diào)的function中加了日志,日志也沒(méi)有打印冤今,說(shuō)明壓根就沒(méi)回調(diào)闺兢。為什么會(huì)這樣?帶著這樣的疑問(wèn)我首先去看了下cocos Sequence的源碼戏罢。
下面簡(jiǎn)單分析下Sequence的實(shí)現(xiàn)邏輯
假設(shè)有這樣一個(gè)序列:
我需要依次執(zhí)行 1,2,3,4.
看過(guò)cocos sequence源碼的同學(xué)可能知道屋谭,一個(gè)sequence其實(shí)只有兩個(gè)action脚囊,如果需要大于兩個(gè)action的,需要用到多個(gè)sequence來(lái)實(shí)現(xiàn)桐磁。也就是說(shuō)悔耘,一個(gè)sequence并不能完成我們的4個(gè)串行動(dòng)作。
sequence初始化大于2個(gè)以上的action的時(shí)候都會(huì)先創(chuàng)建一個(gè)sequence然后繼續(xù)嵌套后面一個(gè)action所意,畫(huà)圖的效果類似這樣:
圖2中最上面的Seq就是我們拿到手的Sequence淮逊,這樣的執(zhí)行順序就是1->2->3->4。
好了扶踊,知道了上面的原理之后泄鹏,我們的每個(gè)Sequence對(duì)自己的兩個(gè)action的時(shí)間做了分段,如果時(shí)間在前面的action時(shí)間段內(nèi)秧耗,就執(zhí)行action[0],否則執(zhí)行action[1].
每次傳遞的逝去時(shí)間也是經(jīng)過(guò)百分比轉(zhuǎn)換過(guò)的备籽,然后多次浮點(diǎn)數(shù)計(jì)算之后導(dǎo)致了一個(gè)結(jié)果就是不精確了~~~
我在源碼中加了日志:
實(shí)際打印結(jié)果跟我的預(yù)期一致:
看最后一行的輸出,t是1.000000分井,_split也是1.000000车猬,但是比較的結(jié)果卻是true,就是t<_split成立尺锚,所以我們沒(méi)有去找action[1],也就是我們的第二個(gè)動(dòng)作珠闰,也就導(dǎo)致了我們的回調(diào)函數(shù)無(wú)法執(zhí)行的結(jié)果。
修改的方法很簡(jiǎn)單:
bool inFirst = t < _split - 0.00001f;
加上一個(gè)精確值瘫辩,
OK就寫(xiě)到這里伏嗜,