cocos2dx骨骼動畫Armature源碼剖析(一)
cocos2dx從編輯器(cocostudio或flash插件dragonBones)得到xml或json數(shù)據(jù),調(diào)用類似如下所示代碼就可以展示出動畫效果
ArmatureDataManager::getInstance()->addArmatureFileInfoAsync( "armature/Dragon.png", "armature/Dragon.plist", "armature/Dragon.xml", this, schedule_selector(TestAsynchronousLoading::dataLoaded)); Armature *armature = nullptr; armature = Armature::create("Dragon"); armature->getAnimation()->playWithIndex(1); addChild(armature);
那么調(diào)用內(nèi)部是怎么實(shí)現(xiàn)的呢?
Armature::create和armature->getAnimation()->playWithIndex都實(shí)現(xiàn)了些什么呢?這幾篇文章將從源碼上分析Armature。
本文是Armature分析的第一篇,將從整體上對cocos2dx里的骨骼動畫進(jìn)行分析。涉及到內(nèi)容如下:
什么是骨骼動畫
編輯器導(dǎo)出數(shù)據(jù)格式概覽
源碼概述
什么是骨骼動畫
游戲中的動畫大體可以分成下面三種:
幀動畫
補(bǔ)間動畫(Tween)
骨骼蒙皮動畫
幀動畫
這個是最基本的動畫,也是下面兩個動畫的基礎(chǔ),一幀展示一張圖,cocos2dx Action中Animate就是幀動畫。優(yōu)點(diǎn)是實(shí)現(xiàn)簡單,缺點(diǎn)是浪費(fèi)資源(一幀一張圖,可對比下面兩種動畫)。
補(bǔ)間動畫
flash中補(bǔ)間動畫用的比較多,不需要一幀一張圖,只需起始狀態(tài)和結(jié)束狀態(tài),中間的狀態(tài)可以進(jìn)行根據(jù)差值與經(jīng)過時(shí)間計(jì)算出來。優(yōu)點(diǎn)是節(jié)省資源,美術(shù)人員比較熟悉。
骨骼蒙皮動畫
骨骼動畫可以認(rèn)為是補(bǔ)間動畫的一種擴(kuò)展,讓動畫的各個部分之間產(chǎn)生關(guān)聯(lián)結(jié)構(gòu)(骨骼),之后把圖綁定到骨骼上。缺點(diǎn)是程序?qū)崿F(xiàn)較復(fù)雜,其優(yōu)點(diǎn)較補(bǔ)間動畫有下面兩點(diǎn)(其他優(yōu)點(diǎn)暫時(shí)沒有發(fā)現(xiàn)):
1.導(dǎo)出配置數(shù)據(jù)少并且美術(shù)制作簡單
假設(shè)有一個下面這樣結(jié)構(gòu)的骨骼
body
armLeft
handLeft
armRight
handRight
head
legLeft
legRight
假設(shè)想在一幀中把動畫整體向右移動,采用補(bǔ)間動畫需要把body、armLeft、legRight等等全部移動,創(chuàng)建新的幀,而骨骼動畫只需移動body的位置,其子節(jié)點(diǎn)會跟隨父節(jié)點(diǎn)移動。對應(yīng)導(dǎo)出的配置中,補(bǔ)間動畫要處理body、armLeft等所有子節(jié)點(diǎn)導(dǎo)出的數(shù)據(jù),而骨骼動畫只有body一個節(jié)點(diǎn)數(shù)據(jù)的改變,導(dǎo)出的數(shù)據(jù)會小很多。
2.關(guān)節(jié)裂紋修復(fù)
下面的圖是偷的《游戲引擎架構(gòu)》449頁,意思是如果美術(shù)作圖時(shí)候不注意,關(guān)節(jié)鏈接處可能會有裂縫。采用骨骼動畫可以解決這個問題,骨骼動畫中的蒙皮可以按權(quán)重綁定到多個關(guān)節(jié)(骨骼中),并且可以按權(quán)重進(jìn)行拉伸,cocostudio骨骼動畫編輯器不熟,不知可不可多綁定,flash的dragonBones插件是不行的。 spine 對這種多綁定有不錯的支持。
編輯器導(dǎo)出數(shù)據(jù)格式概覽
cocostudio導(dǎo)出的json結(jié)構(gòu)和dragonbones導(dǎo)出的xml結(jié)構(gòu)相似,都是骨骼層,動畫層,圖片層三層結(jié)構(gòu),已dragonbones官方的demo為例(有刪減):
<skeleton name="DragonBones_Tutorial_MultiBehavior" frameRate="24" version="2.2"> <armatures> <armature name="Dragon"> <b name="tail" parent="body" x="45.9" y="-70.8" kX="30" kY="30" cX="1" cY="1" pX="11.5" pY="176.35" z="10"> <d name="parts-tail" pX="0" pY="-63.8"/> </b> </armature> </armatures> <animations> <animation name="Dragon"> <mov name="stand" dr="7" to="6" drTW="100" lp="1" twE="0"> </mov> <mov name="walk" dr="8" to="5" drTW="200" lp="1" twE="0"> </mov> <mov name="jump" dr="5" to="3" drTW="5" lp="1" twE="NaN"> </mov> <mov name="fall" dr="5" to="6" drTW="5" lp="1" twE="NaN"> </mov> </animation> </animations> <TextureAtlas name="DragonBones_Tutorial_MultiBehavior" width="512" height="512"> </TextureAtlas> </skeleton>
<armatures></armatures>是骨骼部分,對應(yīng)flash中1區(qū)域,一個layer就是一個bone。
<animations></animations>是動畫部分,對應(yīng)flash中2區(qū)域,用幀標(biāo)簽區(qū)分哪個動畫,比如stand、walk、jump等。
<TextureAtlas></TextureAtlas>是骨骼部分,對應(yīng)flash中3區(qū)域,是皮膚,也就是圖信息。
有了這些信息,就可以在程序中還原flash中的動畫效果,具體dr、drTW、x、kX、kY等等是什么意思之后的文章里會說。
源碼概述
代碼大體可以分成xml或json數(shù)據(jù)的解析 和 用解析出的數(shù)據(jù)產(chǎn)生動畫兩部分。
數(shù)據(jù)解析的相關(guān)代碼的UML
大致介紹下每個類的作用:
DataReaderHelper:解析armatures、animations、TextureAtlas的數(shù)據(jù)生成程序能直接使用的數(shù)據(jù)結(jié)構(gòu)ArmatureData、AnimationData、TextureData。
ArmatureDataManager:管理DataReaderHelper及其解析出來的數(shù)據(jù)。
ArmatureData:對應(yīng)xml中的<armature></armature>。
AnimationData:對應(yīng)xml中的<animation></animation>。
TextureData:對應(yīng)xml中的<SubTexture></SubTexture>。
BoneData:對應(yīng)xml中的<b></b>。
DisplayData:對應(yīng)xml中的<d></d>。
MovementData:對應(yīng)xml中的<mov></mov>。
MovementBoneData:對應(yīng)xml中的<mov><b></b></mov>。
FrameData:對應(yīng)xml中的<mov><b><f></f></b></mov>。
產(chǎn)生動畫相關(guān)代碼的UML
大致介紹下每個類的作用:
Armature:里面包含了骨骼信息及動畫信息,有個這個就可以播放動畫。
Tween:骨骼動畫的補(bǔ)間,一個骨骼一個Tween。對應(yīng)上面的flash面板就是stand動畫的tail層的第一到第七幀。
ArmatureAnimation:所有Tween的集合,夠成一個動畫。
Bone:帶有Tween的骨骼信息,從這里面可以得到某個時(shí)間點(diǎn)的骨骼狀態(tài)。
DisplayFactory:創(chuàng)建skin等顯示對象。
DisplayManager:每個Bone中有一個,管理骨骼上的顯示對象。
Skin:圖的顯示對象。
以上內(nèi)容就是腳本之家的小編給大家分享的cocos2dx骨骼動畫Armature源碼剖析(一),希望大家喜歡。
相關(guān)文章
javascript 加入收藏、設(shè)為首頁(IE,firefox兼容腳本之家版)
網(wǎng)上流行很多的加入收藏、設(shè)為首頁等功能代碼,但各方面不是很完善,特腳本之家編輯特為大家準(zhǔn)備了可以直接使用的代碼。2009-11-11JS幻燈片可循環(huán)播放可平滑旋轉(zhuǎn)帶滾動導(dǎo)航(自寫)
本文為大家介紹下實(shí)現(xiàn)JS幻燈片可循環(huán)播放帶滾動導(dǎo)航可平滑旋轉(zhuǎn)的全過程,效果還不錯,由需要的朋友可以參考下,希望對大家有所幫助2013-08-08JS實(shí)現(xiàn)玩轉(zhuǎn)風(fēng)車
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)玩轉(zhuǎn)風(fēng)車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Next.js路由組使用之組織路由結(jié)構(gòu)示例詳解
這篇文章主要為大家介紹了Next.js路由組使用之組織路由結(jié)構(gòu)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10JavaScript鼠標(biāo)事件,點(diǎn)擊鼠標(biāo)右鍵,彈出div的簡單實(shí)例
下面小編就為大家?guī)硪黄狫avaScript鼠標(biāo)事件,點(diǎn)擊鼠標(biāo)右鍵,彈出div的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08JS實(shí)現(xiàn)微信里判斷頁面是否被分享成功的方法
這篇文章主要介紹了JS實(shí)現(xiàn)微信里判斷頁面是否被分享成功的方法,結(jié)合實(shí)例形式分析了js調(diào)用微信接口判斷網(wǎng)頁分享功能的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06