欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

cocos2dx骨骼動畫Armature源碼剖析(一)

 更新時(shí)間:2015年09月08日 09:12:47   投稿:mrr  
cocos2dx中的骨骼動畫在程序中使用非常方便,從編輯器(cocostudio或flash插件dragonBones)得到xml或json數(shù)據(jù),調(diào)用代碼就可以直接展示出動畫效果,下面通過本篇文章給大家分享cocos2dx骨骼動畫Armature源碼剖析,需要的朋友一起來學(xué)習(xí)吧。

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)文章

最新評論