cocos2d 解密ccbi_CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析
1. 相關(guān)的類
先介紹和AnimationManager相關(guān)的幾個(gè)類:
CCBSequence
時(shí)間線。有成員duration(時(shí)間線時(shí)間,默認(rèn)10秒)、name(時(shí)間線名)、SequenceId(Id)、ChainedSequenceId(重復(fù)執(zhí)行的時(shí)間線Id)、SequenceProperty* mCallbackChannel(關(guān)鍵幀執(zhí)行回調(diào))、SequenceProperty* mSoundChannel(關(guān)鍵幀執(zhí)行Sound)。
CCBSequenceProperty
存儲(chǔ)keyframe的容器。
有成員name、int type、Vector?keyframes(存儲(chǔ)關(guān)鍵幀keyframe)。
對于動(dòng)畫而言,Property的name是動(dòng)畫改變的屬性的名字,例如position、rotation等。
CCBKeyframe
關(guān)鍵幀。CCB的動(dòng)畫是以關(guān)鍵幀為基礎(chǔ)的,我們可以在時(shí)間線上設(shè)置關(guān)鍵幀,并為關(guān)鍵幀設(shè)置屬性,CCB能夠?qū)崿F(xiàn)在關(guān)鍵幀之間實(shí)現(xiàn)動(dòng)畫。關(guān)鍵幀不僅可以用來設(shè)置動(dòng)畫屬性,也能用于觸發(fā)回調(diào)、聲音。
有相關(guān)成員value(屬性值)、time(發(fā)生的時(shí)間)、EasingType easingType(特效類型)、easingOpt(特效的值,部分特效有用)。
一個(gè)動(dòng)畫,需要關(guān)鍵幀才能呈現(xiàn)出動(dòng)畫效果。
2. 部分成員變量
CCBReader有成員animationManager,關(guān)聯(lián)了一個(gè)動(dòng)畫管理器。還有成員Map?animationManagers,將解析到的node和動(dòng)畫管理器關(guān)聯(lián)。
AnimationManager是CCB項(xiàng)目中所有動(dòng)畫的管理中心。
成員Vector sequences,實(shí)際存儲(chǔ)的是動(dòng)畫的時(shí)間線。
成員map>> nodeSequences,其結(jié)構(gòu)較復(fù)雜,用下圖較為容易理解:
簡而言之:
nodeSequences存儲(chǔ)的是動(dòng)畫管理器管理的node和node對應(yīng)的所有Property,Property存儲(chǔ)關(guān)鍵幀,同一Property存儲(chǔ)的關(guān)鍵幀是在同一變換(動(dòng)畫的屬性、回調(diào)等)中起作用的。
node對應(yīng)的Property按照Property所屬的時(shí)間線(Sequence)Id進(jìn)行分類。
3. 解析過程中 AnimationManager 相關(guān)操作
解析ccbi文件之前,設(shè)置成員rootContainerSize為屏幕大小,設(shè)置成員owner為this(執(zhí)行CCBReader解析方法的場景或?qū)?。
在解析ccbi文件時(shí),執(zhí)行CCBReader的readSequences方法解析時(shí)間線設(shè)置Sequence成員變量,每個(gè)時(shí)間線存儲(chǔ)到容器sequences之中,并設(shè)置動(dòng)畫管理器成員autoPlaySequenceId,作為自動(dòng)執(zhí)行的時(shí)間線Id。
對于每個(gè)時(shí)間線,還可以設(shè)置CallbackChannel和SoundChannel,這兩者都是SequenceProperty類型,在關(guān)鍵幀執(zhí)行回調(diào)或聲音。
接下來執(zhí)行readNodeGraph方法,設(shè)置node相關(guān)的動(dòng)畫內(nèi)容,并存儲(chǔ)到容器nodeSequences之中。項(xiàng)目的根節(jié)點(diǎn)Layer作為成員rootNode。
.ccbi文件解析完成之后,把根節(jié)點(diǎn)Layer和動(dòng)畫管理器加入CCBReader成員容器animationManagers之中。
之后執(zhí)行CCBReader關(guān)聯(lián)的animationManager的runAnimationsForSequenceIdTweenDuration方法,參數(shù):自動(dòng)執(zhí)行的時(shí)間線Id(解析文件時(shí)獲取并設(shè)置的),0。
4.?runAnimationsForSequenceIdTweenDuration 方法
就動(dòng)畫方面,readNodeGraph方法只是將動(dòng)畫需要的屬性設(shè)置到了關(guān)鍵幀,并存儲(chǔ)在動(dòng)畫管理器的容器中。真正將關(guān)鍵幀的動(dòng)畫屬性轉(zhuǎn)為實(shí)際的動(dòng)畫效果是依賴本方法。
1. 刪除根節(jié)點(diǎn)Layer的所有action(removeAllActionsFromTarget)。
2. 遍歷nodeSequences。對node刪除所有action。獲取當(dāng)前node在當(dāng)前時(shí)間線Id上的所有Property。
3. 遍歷這些Property。對每個(gè)Property,先通過第一個(gè)關(guān)鍵幀設(shè)置初始狀態(tài)。再設(shè)置動(dòng)作序列。
動(dòng)作序列設(shè)置流程:
1. Property內(nèi)的關(guān)鍵幀數(shù)量最少為2。
2. 根據(jù)第一個(gè)關(guān)鍵幀的起始時(shí)間,設(shè)置延遲動(dòng)作DelayTime。
3. 創(chuàng)建兩幀之間的動(dòng)作。兩幀時(shí)間差作為動(dòng)作時(shí)間,第二幀的狀態(tài)作為動(dòng)作結(jié)束時(shí)的狀態(tài)。動(dòng)作特效保存在第一幀,讀取第一幀中的特效,對動(dòng)作進(jìn)行包裝,得到新動(dòng)作。
4. 還有幀的情況下,進(jìn)行循環(huán),幀下標(biāo)+1,對此時(shí)兩幀執(zhí)行第三步(創(chuàng)建兩幀的動(dòng)作)。
5. 所有動(dòng)作加入動(dòng)作序列,對當(dāng)前node執(zhí)行動(dòng)作序列(runAction)。
4. 獲取當(dāng)前時(shí)間線時(shí)間長度,根節(jié)點(diǎn)layer在時(shí)間線結(jié)束時(shí),執(zhí)行函數(shù)動(dòng)作調(diào)用函數(shù)AnimationManager::sequenceCompleted。
回調(diào)函數(shù)是在時(shí)間線結(jié)束后,可以通過ChainedSequenceId,設(shè)置并執(zhí)行要重復(fù)執(zhí)行的時(shí)間線。
5. 通過CallbackChannel的關(guān)鍵幀,生成一個(gè)回調(diào)函數(shù)動(dòng)作序列,根節(jié)點(diǎn)Layer執(zhí)行該動(dòng)作序列(runAction)。
6.?通過SoundChannel的關(guān)鍵幀,生成一個(gè)聲音動(dòng)作序列,根節(jié)點(diǎn)Layer執(zhí)行該動(dòng)作序列(runAction)。
7. 此時(shí)的時(shí)間線Id作為runningSequence。在時(shí)間線運(yùn)行結(jié)束后調(diào)用的sequenceCompleted方法會(huì)獲取該值,用來獲取當(dāng)前時(shí)間線,從而設(shè)置下一時(shí)間線id并執(zhí)行下一時(shí)間線。
5. 總結(jié)
CCB動(dòng)畫的實(shí)質(zhì)是多個(gè)動(dòng)作的組合。
在解析ccbi文件NodeGraph后,時(shí)間線和動(dòng)畫相關(guān)內(nèi)容已經(jīng)全部讀取完成,并存儲(chǔ)到了相應(yīng)的容器里。接下來就要根據(jù)容器內(nèi)動(dòng)畫相關(guān)內(nèi)容,設(shè)置動(dòng)作,并交給對應(yīng)的node執(zhí)行動(dòng)作。
node的動(dòng)畫信息(關(guān)鍵幀)是由SequenceProperty存儲(chǔ),通過AnimationManager的容器關(guān)聯(lián)Node和Property。
node可能在多個(gè)時(shí)間線有動(dòng)畫,所以要通過時(shí)間線Id給Node的Property進(jìn)行分類。
Sequence僅作為時(shí)間線使用。時(shí)間線也有Property,其中的關(guān)鍵幀作為觸發(fā)回調(diào)函數(shù)或聲音使用。
總結(jié)
以上是生活随笔為你收集整理的cocos2d 解密ccbi_CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字库芯片学习之汉字内码
- 下一篇: 联想电脑开机锁屏壁纸地址