Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉蟲記之控制場景文件中的骨骼動畫

Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉蟲記之控制場景文件中的骨骼動畫javascript

引子

這段時間一直努力在把早期版本的拇指接龍遊戲(Cocos2d-x 2.2.3+CocoStudio 1.4.0.1)升級到當前相對穩定的高大上環境——Cocos2d-x 3.8.1+Cocos Studio 2.3.2。行程中遇到很多麻煩,時間不知不覺像流水同樣悄然逝去(這正是我時不時酸酸地想起「程序猿」三字的主要緣由)。想之再三,仍是努力記錄下來,一來爲本身可能逝去的記憶,二來爲一些新夥伴少踏幾個坑而節約些許時間。html

本文討論的是在新版本中如何從代碼中控制在cocos Studio場景編輯器中加入的骨骼動畫的操做。java

cpp-tests中的誤導

在升級以前就從網絡上及部分手頭圖書中瞭解到cocos2d-x 3.x版本中的較大變更。因而,仍是很當心地決定先從研讀新版本發行中相伴隨的最經典的示例工程cpp-tests開始。在有了一個總體思路後,結合原來版本代碼開始更新,有的是代碼部分,有的是studio圖形數據部分,固然也包括該示例遊戲涉及的有米積分牆SDK相關代碼的更新與ShareSDK集成部分的更新。node

網絡搜索及研究示例工程cpp-tests的結果代表,官方的文檔有很多已通過時。可是,值得確定的一點是工程cpp-tests中提倡儘可能使用當前最新的cocos2d-x代碼操縱早期幾乎是各類版本studio導出的資源文件,還包括Flash動畫文件及Spine動畫文件,等等。c++

但遺憾的是,相應的官方資料中並無指出這一點。固然,在示例工程註釋中也沒有必要過於瑣碎地添加這種使用說明信息。面試

因而,對於像我這樣的新版本的發燒友來講,要使用其提供的最新技術主要有兩個途徑:一個是儘可能全面地查看官方文檔(可是最新版本有關資料少得可憐),再一個就是閱讀SDK源碼。json

如題中所示的「誤導」部分地體如今當前最新的cocos2d-x c++代碼操縱studio導出的動畫資源文件方面。網絡

若是選擇開發語言是c++,那麼對應的studio版本(2.3.2)的資料文件只能是.csb文件(場景文件、圖層文件、結點文件、骨骼動畫文件、3D場景文件的擴展名都是.csb)。app

個別網絡資料上說是能夠操縱studio版本(2.3.2)導出的json文件(若是選擇語言是javascript的話),我在嘗試後發現基本不能夠,但不是徹底不能夠。源碼分析發現,這種方式導出的json文件與早期studio版本導出的exportjson文件或者json文件格式上存在不少的不一致。編輯器

所以,應該明確的一點就是對於使用cocos2d-x 3.8.1 C++代碼操做的studio版本(2.3.2)導出的資源文件的擴展名應當是.csb文件(二進制文件)。

可是,工程cpp-tests中的確存在大量的操做早期版本場景文件、GUI圖層文件、骨骼動畫文件的大量示例代碼,而官方文檔及這些文件註釋中又缺乏必要的說明,所以很容易誤導初學者,而導致其浪費大量的時間進行可行性編碼試驗。

對於新版本環境下骨骼動畫的操做我尚未全面試驗,所以僅做部分試驗結果說明。

來自www.cocoachina.com的啓示

在上述網站的《Cocos骨骼動畫功能解密》(http://www.cocoachina.com/cocos/20150907/13355.html)一文中我捕獲到以下最新的參考代碼。

//首先經過CSLoader讀入Cocos編輯器導出的csb文件,並將CSLoader返回的Node轉換爲SkeletonNode*類型
SkeletonNode* skeletonNode = static_cast(CSLoader::createNode("DemoPlayer.csb"));
//得到到骨骼節點以後,能夠對骨骼節點的Scale、Position等進行設置
skeletonNode->setScale(0.2f);
skeletonNode->setPosition(150, 150);
//而後將骨骼節點添加到父節點上
this->addChild(skeletonNode);
//接下來,再次經過CSLoader讀入Cocos編輯器導出的csb文件,建立一個ActionTimeline對象,這個對象存儲着骨骼節點的全部動畫
ActionTimeline* action = CSLoader::createTimeline("DemoPlayer.csb");
//咱們爲骨骼節點的動畫設置一個tag值方便後邊取出動畫,建議這裏使用枚舉的形式來定義tag值(爲了方便這裏直接寫100了)
action->setTag(100);
skeletonNode->runAction(action);
//播放action中的動畫(參數1:動畫名稱   參數2:是否循環播放)
action->play("animation0", false);
//咱們能夠經過每一個骨骼節點上邊的某個皮膚(圖片)的名字來獲取這"塊"骨骼
const std::string weapBoneName = "Layer20";
auto weaponHandeBone = skeletonNode->getBoneNode(weapBoneName);
//咱們能夠建立一個Sprite並把它加到剛剛獲取到的那"塊"骨骼的皮膚中
auto weapSkinToAdd = Sprite::create("ArcherPeng/girl_arms.png");
weapSkinToAdd->setName("Knife");
weapSkinToAdd->setPosition(Vec2(135, 23));
weapSkinToAdd->setScale(3.0f);
weapSkinToAdd->setRotation(86);
weaponHandeBone->addSkin(weapSkinToAdd, false);//加載到皮膚中
//而後將新加入的皮膚顯示出來
weaponHandeBone->displaySkin(weapSkinToAdd, true);
//固然也能夠換回原來的("3"指的是"3.png"原先皮膚的名字)
weaponHandeBone->displaySkin("3", true);
Node *node=CSLoader::createNode("DemoPlayer.csb");

3.8.1 c++代碼加載studio 2.3.2導出的各類.csb二進制資源文件的統一方式。可是,根據本人浮淺分析:更細緻的資料數據操縱示例工程中根本沒有提供。

 

初見天日

下面以我本身建立的一個簡單示例來講明如何從C++ 3.8.1代碼中操做studio 2.3.2導出的.csb文件。

首先,看一下個人示例工程截圖(我建立了一個場景文件MainScene.csd,其中加入的是一個骨骼動畫文件):

wKiom1ZJ0vfD_NNMAAIpvEfmcKM036.jpg

骨骼動畫文件是DemoPlayer.csd,以下,你一看就知道的。

wKiom1ZJ0siCu-jTAANS6uEhgzs191.jpg

接下來,問題的關鍵定位在:如何從cocos2d-x 3.8.1 c++代碼中操做上面導出的二進制資源MainScene.csb,並進而播放其中的骨骼動畫以及進行其餘更細緻的骨骼動畫行爲控制。

在分析了上面代碼提示和綜合cpp-tests工程代碼後,我做出以下大膽嘗試:

        Node * rootNode = CSLoader::createNode("MainScene.csb");
         Node* child = rootNode->getChildByName("ProjectNode_1");
 
         SkeletonNode* arm = static_cast<SkeletonNode*>(child);
         addChild(arm);
 
         ActionTimeline* action = CSLoader::createTimeline("MainScene.csb");
         arm->runAction(action);
         action->gotoFrameAndPlay(0);

部分缺憾

cpp-tests中常常有以下代碼:

       Node* _rootNode = SceneReader::getInstance()->createNodeWithSceneFile("res/MainScene.json");

恰巧,個人機器上有一個老版本的cocoStudio 1.4.0.1,其導出的場景文件正是json格式。試驗證實,使用cocos2d-x c++ 3.8.1經過上述代碼操做場景文件很是順利。固然,接下來,相應的進一步操做場景中對象的代碼也是沒有問題的,與示例工程中一致。

可是,簡單地源碼跟蹤發現,createNodeWithSceneFile文件也可使用.csb文件做爲參數。儘管沒有細緻研究,可是試驗證實下面的代碼根本是行不通的。

         Node* _rootNode = SceneReader::getInstance()->createNodeWithSceneFile("res/MainScene.csb");
         Node* child = _rootNode->getChildByName("ProjectNode_1");

相似於上面的問題,示例工程中還存在很多,但願研究的同窗們當心注意了。

 

 

【補充】

在示例文件SceneEditorTest.cpp 中的確存在使用上述方法,即createNodeWithSceneFile加載.csb文件的情形。例以下面所示的函數:

wKioL1ZJ4TOBKaTlAAH9rxeeokw291.jpg

 

注意,其中相關幫助函數loadFileChangeHelper代碼以下所示:

void SceneEditorTestBase::loadFileChangeHelper(std::string& filePathName)

{

    std::string::size_type n = filePathName.find_last_of(".");

 if(n == std::string::npos)

  return;

 filePathName = filePathName.substr(0,n);

 if(_isCsbLoad)

  filePathName.append(".csb");

 else

  filePathName.append(".json");

}

而上面的示例,即cpp-tests中的一部分在個人機器上是順利調試經過的。也就是說,createNodeWithSceneFile的確可以加載.csb文件,但卻不是cocos studio 2.3.2導出的.csb文件。據個人估計,應該是早期版本studio導出的.csb文件。

 

怎麼樣?感受有些麻煩吧。不一樣的.csb文件竟然有的可以經過createNodeWithSceneFile加載,而有的不行!遺憾的是,官方沒有給出明確說明!!!

 

 

 

 

小小結

不敢多說一些,由於我到此的結論只停留在片面。可是,有一點基本是確定的:當前的CPP-TESTS中對於早期STUDIO資源操做提供的示例已經很是豐富了,但相比之下,對於對應最新版本的STUDIO導出的二進制.csb文件的深刻操做示例提供的很是欠缺。所以,這種狀況下,要想使用最新版本的studio及相應版本的cocos2d-x 3.x版本,深刻研究SDK源碼是必需的;但同時也要結合網絡上儘量新的示例(特別是來自於cocoachina.com網絡的資源)進行。

相關文章
相關標籤/搜索