中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解CCSkeleton Cocos2D中的骨骼動畫

發布時間:2021-11-11 09:39:47 來源:億速云 閱讀:182 作者:柒染 欄目:游戲開發

如何理解CCSkeleton Cocos2D中的骨骼動畫,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

CCSkeleton

Cocos2d-X 2.1.3 的Test中新增加了一個例子SpineTest。SpineTest這個例子主要是來介紹,新增加的一個類 CCSkeleton 它是用來播放骨骼動畫的(多謝五哥提醒哦)。跟觸控的L大聊過,據說他們下個版本的CocoStudio中骨骼動畫就要用這個來實現。好了閑話少說我們來介紹一下這個新來的驚喜把!

   CCSkeleton 播放動畫主要依靠三個文件。

   1.“.png”    用來保存尸塊的合成圖。

   2.“.atlas”   用來保存合成圖中每個尸塊的信息。

   3.“.JSON”   用來保存動作的信息。

   打開 Resource 我們會看到,spineboy.atlas 這個就是我們看到的那個小人 每個尸塊的信息。下面用一段簡短的代碼來介紹下他的結構。具體的還要等工具發布出來才能確定。

//Atlas文件中每個參數的含義:
spineboy.png            //該atlas文件是作用于哪個png
format: RGBA8888    //格式RGBA8888
filter: Linear,Linear    //濾波器 :線性
repeat: none             //重復:無
/**下面的可以有多個,因為是單個尸塊的信息*/
head                        // 尸塊名稱 頭
  rotate: false            //是否需要旋轉
  xy: 1, 122                //起始點,以左上角為0,0
  size: 121, 132         //圖的大小
  orig: 121, 132        //應該和圖的大小相同
  offset: 0, 0        
  index: -1

我們看到了,Atlas 文件的文件頭中包含一個 format:RGBA8888 這個跟TxtruePacker一樣,可以更好的來節省內存。而下面包含了尸塊的 名稱、起始點、大小等信息。

spineboy.json 它里面包含了所有的動作、骨骼信息,所以它的體積也是很大的,一個跳和一個走路的動作就占了25K的空間,如果你的游戲中角色和動作比較多的話,就要有很多的資源需要第一次進入游戲時更新了。好我們現在打開 spineboy.json 來看一下它里面的結構。

JSON中 每個數據的含義:
{   //骨骼
    "bones":
    [   //第一個骨骼點 root
        { "name": "root" },
        //第二個骨骼點 hip 他的父節點為root x:0.64 y:114.41
        { "name": "hip", "parent": "root", "x": 0.64, "y": 114.41 },
        //第三個骨骼點 left upper leg 他的父節點為hip x:0.64 y:114.41 旋轉角度:-89.09
        { "name": "left upper leg", "parent": "hip", "length": 50.39, "x": 14.45, "y": 2.81, "rotation": -89.09 }
     /*這里的屬性都是骨骼的初始屬性*/
     ],
    //連接
    "slots":
    [
        //連接器:left upper leg    骨骼點名稱:left upper leg    連接物:left-upper-leg
        { "name": "left upper leg", "bone": "left upper leg", "p_w_upload": "left-upper-leg" }
    ],
    "skins":
    {
        "default":
        {
            "left upper leg":
            {
                "left-upper-leg": { "x": 26.12, "y": -1.85, "rotation": 89.09, "width": 33, "height": 67 }
            }
        }
    },
    //動作
    "animations":
    {
        //動作名稱:walk
        "walk":
        {
            //walk中 bones 在時間線上的變化
            "bones":
            {
                //left upper leg 骨骼在時間上的變化
                "left upper leg":
                {
                    //roate的變化
                    "rotate":
                    [
                        //時間線上0 角度變化-26.55
                        { "time": 0, "angle": -26.55 },
                        //時間線上0.1333 角度變化-8.78
                        { "time": 0.1333, "angle": -8.78 }
                    ],
                    //坐標的變化
                    "translate":
                    [
                        //時間線上0 X變化-3 Y變化-2.25
                        { "time": 0, "x": -3, "y": -2.25 },
                        //時間線上0.4 X變化-2.18 Y變化-2.25
                        { "time": 0.4, "x": -2.18, "y": -2.25 }
                    ]
                }
            }
        }
    }
}

   從上面的注釋我們看到了,其實JSON中有兩大部分。

       1.骨骼、連接器等等相關骨骼的信息。

       2.動作信息,有著動作在時間線上每個時間點的變化信息。

   細心的同學會發現,每個尸塊的 旋轉、坐標 這兩項變化的數據是分開的,這也是作者的多年的經驗體現之處。這樣做的好處可以讓動作更加靈活。否則,旋轉和坐標變化在時間線上不一致的話就麻煩了。

   經過上面介紹動作所需的文件后,很多同學已經大概了解了。下面我們來看一下在Cocos2d-X中CCSkeleton 這個類的構成。

!!!!新改版的博客編輯器不能添加圖片0 0 ,大家去附件中下載圖吧。

CCSkeleton 主要是由 Atlas 和 Skeleton 來組成的, Atlas 中主要來保存尸塊貼圖的信息,而 Skeleton 主要來保存其中的動畫信息。

skeletonNode = CCSkeleton::createWithFile("spine/spineboy.json","spine/spineboy.atlas");

   //參數1:動作解析文件 參數2:尸塊解析文件 參數3:(可缺省)縮放比例 缺省值為1

   創建一個骨骼動畫的對象就是這么簡單,給他提供你的尸塊解析文件,動畫解析文件就可以了。至于尸塊的大圖,它會去超找Atlas 文件中文件頭的那個png名字。

AnimationStateData_setMixByName(skeletonNode->state->data,"walk","jump",0.4f);

//參數1:動作數據 參數2:起始的動作名稱 參數3:要到的動作名稱 參數4:銜接動畫的時間

   這個函數主要是用來銜接兩個動作的,例如:跳的動作結束之后如果直接執行走路的動作,你會發現小人的動作中間沒有銜接,這樣在游戲中的表現是很不好的。所以我們需要給兩個動作之間加一個過渡,而這個函數它的功能就體現在此。

AnimationState_setAnimationByName(skeleton->state,"walk",false);

//參數1:動作 參數2:動作名稱 參數3:是否重復播放

   例如走路我們是要重復的播放動畫,利用這個函數,我們就不用自己去寫重復播放的代碼了。只需要一個BOOL 輕松解決!

skeletonNode->timeScale = 0.3f;
skeletonNode->debugBones = false;

   代碼1主要來控制動畫的播放速度,我們默認的是1。

代碼2是用來顯示小人身上那些點和線,這些點和線就是骨骼,開啟了debugBones我們可以清楚的看到在動畫過程中每個骨骼所進行的改變。

  我們發現update中還有部分代碼,我來解釋一下。

skeletonNode->state->loop

這個loop的變量可以獲取到當前執行的動畫是否是循環播放的動畫,他會返回一個布爾值,讓我們可以用來邏輯判斷。

skeletonNode->state->time

他會返回一個float值,這個float值會告訴你當前的動畫已經重復的播放了幾次,像Test中這樣走一次路,跳一次的動作用他來做非常方便。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沈阳市| 中牟县| 绥棱县| 罗平县| 鄂托克前旗| 任丘市| 辰溪县| 淮阳县| 古交市| 镇安县| 东阳市| 治多县| 嵊州市| 镇康县| 肃南| 叶城县| 石棉县| 林甸县| 桂林市| 台北县| 丹阳市| 荥阳市| 孝感市| 南丹县| 保康县| 宜城市| 芜湖县| 承德县| 新巴尔虎右旗| 监利县| 龙川县| 铅山县| 商都县| 临城县| 靖州| 永寿县| 公安县| 孟连| 九寨沟县| 丹寨县| 汶上县|