您好,登錄后才能下訂單哦!
Cocos2d-x 3.8.1+Cocos Studio 2.3.2捉蟲記之控制場景文件中的骨骼動畫
這段時間一直努力在把早期版本的拇指接龍游戲(Cocos2d-x 2.2.3+CocoStudio 1.4.0.1)升級到當前相對穩定的高大上環境——Cocos2d-x 3.8.1+Cocos Studio 2.3.2。行程中遇到不少麻煩,時間不知不覺像流水一樣悄然逝去(這正是我時不時酸酸地想起“程序猿”三字的主要原因)。想之再三,還是努力記錄下來,一來為自己可能逝去的記憶,二來為一些新伙伴少踏幾個坑而節約些許時間。
本文討論的是在新版本中如何從代碼中控制在cocos Studio場景編輯器中加入的骨骼動畫的操作。
在升級之前就從網絡上及部分手頭圖書中了解到cocos2d-x 3.x版本中的較大變動。于是,還是很小心地決定先從研讀新版本發行中相伴隨的最經典的示例工程cpp-tests開始。在有了一個整體思路后,結合原來版本代碼開始更新,有的是代碼部分,有的是studio圖形數據部分,當然也包括該示例游戲涉及的有米積分墻SDK相關代碼的更新與ShareSDK集成部分的更新。
網絡搜索及研究示例工程cpp-tests的結果表明,官方的文檔有不少已經過時。但是,值得肯定的一點是工程cpp-tests中提倡盡量使用當前最新的cocos2d-x代碼操縱早期幾乎是各種版本studio導出的資源文件,還包括Flash動畫文件及Spine動畫文件,等等。
但遺憾的是,相應的官方資料中并沒有指出這一點。當然,在示例工程注釋中也沒有必要過于瑣碎地添加這種使用說明信息。
于是,對于像我這樣的新版本的發燒友來說,要使用其提供的最新技術主要有兩個途徑:一個是盡量全面地查看官方文檔(但是最新版本有關資料少得可憐),再一個就是閱讀SDK源碼。
如題中所示的“誤導”部分地體現在當前最新的cocos2d-x c++代碼操縱studio導出的動畫資源文件方面。
如果選擇開發語言是c++,那么對應的studio版本(2.3.2)的資料文件只能是.csb文件(場景文件、圖層文件、結點文件、骨骼動畫文件、3D場景文件的擴展名都是.csb)。
個別網絡資料上說是可以操縱studio版本(2.3.2)導出的json文件(如果選擇語言是javascript的話),我在嘗試后發現基本不可以,但不是完全不可以。源碼分析發現,這種方式導出的json文件與早期studio版本導出的exportjson文件或者json文件格式上存在很多的不一致。
因此,應該明確的一點就是對于使用cocos2d-x 3.8.1 C++代碼操作的studio版本(2.3.2)導出的資源文件的擴展名應當是.csb文件(二進制文件)。
但是,工程cpp-tests中的確存在大量的操作早期版本場景文件、GUI圖層文件、骨骼動畫文件的大量示例代碼,而官方文檔及這些文件注釋中又缺少必要的說明,因此很容易誤導初學者,而致使其浪費大量的時間進行可行性編碼試驗。
對于新版本環境下骨骼動畫的操作我還沒有全面試驗,因此僅作部分試驗結果說明。
在上述網站的《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,其中加入的是一個骨骼動畫文件):
骨骼動畫文件是DemoPlayer.csd,如下,你一看就知道的。
接下來,問題的關鍵定位在:如何從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文件的情形。例如下面所示的函數:
注意,其中相關幫助函數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網絡的資源)進行。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。