日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d 解密ccbi_CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析

發布時間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2d 解密ccbi_CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 相關的類

先介紹和AnimationManager相關的幾個類:

CCBSequence

時間線。有成員duration(時間線時間,默認10秒)、name(時間線名)、SequenceId(Id)、ChainedSequenceId(重復執行的時間線Id)、SequenceProperty* mCallbackChannel(關鍵幀執行回調)、SequenceProperty* mSoundChannel(關鍵幀執行Sound)。

CCBSequenceProperty

存儲keyframe的容器。

有成員name、int type、Vector?keyframes(存儲關鍵幀keyframe)。

對于動畫而言,Property的name是動畫改變的屬性的名字,例如position、rotation等。

CCBKeyframe

關鍵幀。CCB的動畫是以關鍵幀為基礎的,我們可以在時間線上設置關鍵幀,并為關鍵幀設置屬性,CCB能夠實現在關鍵幀之間實現動畫。關鍵幀不僅可以用來設置動畫屬性,也能用于觸發回調、聲音。

有相關成員value(屬性值)、time(發生的時間)、EasingType easingType(特效類型)、easingOpt(特效的值,部分特效有用)。

一個動畫,需要關鍵幀才能呈現出動畫效果。

2. 部分成員變量

CCBReader有成員animationManager,關聯了一個動畫管理器。還有成員Map?animationManagers,將解析到的node和動畫管理器關聯。

AnimationManager是CCB項目中所有動畫的管理中心。

成員Vector sequences,實際存儲的是動畫的時間線。

成員map>> nodeSequences,其結構較復雜,用下圖較為容易理解:

簡而言之:

nodeSequences存儲的是動畫管理器管理的node和node對應的所有Property,Property存儲關鍵幀,同一Property存儲的關鍵幀是在同一變換(動畫的屬性、回調等)中起作用的。

node對應的Property按照Property所屬的時間線(Sequence)Id進行分類。

3. 解析過程中 AnimationManager 相關操作

解析ccbi文件之前,設置成員rootContainerSize為屏幕大小,設置成員owner為this(執行CCBReader解析方法的場景或層)。

在解析ccbi文件時,執行CCBReader的readSequences方法解析時間線設置Sequence成員變量,每個時間線存儲到容器sequences之中,并設置動畫管理器成員autoPlaySequenceId,作為自動執行的時間線Id。

對于每個時間線,還可以設置CallbackChannel和SoundChannel,這兩者都是SequenceProperty類型,在關鍵幀執行回調或聲音。

接下來執行readNodeGraph方法,設置node相關的動畫內容,并存儲到容器nodeSequences之中。項目的根節點Layer作為成員rootNode。

.ccbi文件解析完成之后,把根節點Layer和動畫管理器加入CCBReader成員容器animationManagers之中。

之后執行CCBReader關聯的animationManager的runAnimationsForSequenceIdTweenDuration方法,參數:自動執行的時間線Id(解析文件時獲取并設置的),0。

4.?runAnimationsForSequenceIdTweenDuration 方法

就動畫方面,readNodeGraph方法只是將動畫需要的屬性設置到了關鍵幀,并存儲在動畫管理器的容器中。真正將關鍵幀的動畫屬性轉為實際的動畫效果是依賴本方法。

1. 刪除根節點Layer的所有action(removeAllActionsFromTarget)。

2. 遍歷nodeSequences。對node刪除所有action。獲取當前node在當前時間線Id上的所有Property。

3. 遍歷這些Property。對每個Property,先通過第一個關鍵幀設置初始狀態。再設置動作序列。

動作序列設置流程:

1. Property內的關鍵幀數量最少為2。

2. 根據第一個關鍵幀的起始時間,設置延遲動作DelayTime。

3. 創建兩幀之間的動作。兩幀時間差作為動作時間,第二幀的狀態作為動作結束時的狀態。動作特效保存在第一幀,讀取第一幀中的特效,對動作進行包裝,得到新動作。

4. 還有幀的情況下,進行循環,幀下標+1,對此時兩幀執行第三步(創建兩幀的動作)。

5. 所有動作加入動作序列,對當前node執行動作序列(runAction)。

4. 獲取當前時間線時間長度,根節點layer在時間線結束時,執行函數動作調用函數AnimationManager::sequenceCompleted。

回調函數是在時間線結束后,可以通過ChainedSequenceId,設置并執行要重復執行的時間線。

5. 通過CallbackChannel的關鍵幀,生成一個回調函數動作序列,根節點Layer執行該動作序列(runAction)。

6.?通過SoundChannel的關鍵幀,生成一個聲音動作序列,根節點Layer執行該動作序列(runAction)。

7. 此時的時間線Id作為runningSequence。在時間線運行結束后調用的sequenceCompleted方法會獲取該值,用來獲取當前時間線,從而設置下一時間線id并執行下一時間線。

5. 總結

CCB動畫的實質是多個動作的組合。

在解析ccbi文件NodeGraph后,時間線和動畫相關內容已經全部讀取完成,并存儲到了相應的容器里。接下來就要根據容器內動畫相關內容,設置動作,并交給對應的node執行動作。

node的動畫信息(關鍵幀)是由SequenceProperty存儲,通過AnimationManager的容器關聯Node和Property。

node可能在多個時間線有動畫,所以要通過時間線Id給Node的Property進行分類。

Sequence僅作為時間線使用。時間線也有Property,其中的關鍵幀作為觸發回調函數或聲音使用。

總結

以上是生活随笔為你收集整理的cocos2d 解密ccbi_CocosBuilder 学习笔记(3) AnimationManager 与 ccbi 文件解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。