引子
這段時(shí)間一直努力在把早期版本的拇指接龍游戲(Cocos2d-x 2.2.3+CocoStudio 1.4.0.1)升級(jí)到當(dāng)前相對(duì)穩(wěn)定的高大上環(huán)境——Cocos2d-x 3.8.1+Cocos Studio 2.3.2。行程中遇到不少麻煩,時(shí)間不知不覺(jué)像流水一樣悄然逝去(這正是我時(shí)不時(shí)酸酸地想起“程序猿”三字的主要原因)。想之再三,還是努力記錄下來(lái),一來(lái)為自己可能逝去的記憶,二來(lái)為一些新伙伴少踏幾個(gè)坑而節(jié)約些許時(shí)間。
本文討論的是在新版本中如何從代碼中控制在cocos Studio場(chǎng)景編輯器中加入的骨骼動(dòng)畫(huà)的操作。
cpp-tests中的誤導(dǎo)
在升級(jí)之前就從網(wǎng)絡(luò)上及部分手頭圖書(shū)中了解到cocos2d-x 3.x版本中的較大變動(dòng)。于是,還是很小心地決定先從研讀新版本發(fā)行中相伴隨的最經(jīng)典的示例工程cpp-tests開(kāi)始。在有了一個(gè)整體思路后,結(jié)合原來(lái)版本代碼開(kāi)始更新,有的是代碼部分,有的是studio圖形數(shù)據(jù)部分,當(dāng)然也包括該示例游戲涉及的有米積分墻SDK相關(guān)代碼的更新與ShareSDK集成部分的更新。
網(wǎng)絡(luò)搜索及研究示例工程cpp-tests的結(jié)果表明,官方的文檔有不少已經(jīng)過(guò)時(shí)。但是,值得肯定的一點(diǎn)是工程cpp-tests中提倡盡量使用當(dāng)前最新的cocos2d-x代碼操縱早期幾乎是各種版本studio導(dǎo)出的資源文件,還包括Flash動(dòng)畫(huà)文件及Spine動(dòng)畫(huà)文件,等等。
但遺憾的是,相應(yīng)的官方資料中并沒(méi)有指出這一點(diǎn)。當(dāng)然,在示例工程注釋中也沒(méi)有必要過(guò)于瑣碎地添加這種使用說(shuō)明信息。
于是,對(duì)于像我這樣的新版本的發(fā)燒友來(lái)說(shuō),要使用其提供的最新技術(shù)主要有兩個(gè)途徑:一個(gè)是盡量全面地查看官方文檔(但是最新版本有關(guān)資料少得可憐),再一個(gè)就是閱讀SDK源碼。
如題中所示的“誤導(dǎo)”部分地體現(xiàn)在當(dāng)前最新的cocos2d-x c++代碼操縱studio導(dǎo)出的動(dòng)畫(huà)資源文件方面。
如果選擇開(kāi)發(fā)語(yǔ)言是c++,那么對(duì)應(yīng)的studio版本(2.3.2)的資料文件只能是.csb文件(場(chǎng)景文件、圖層文件、結(jié)點(diǎn)文件、骨骼動(dòng)畫(huà)文件、3D場(chǎng)景文件的擴(kuò)展名都是.csb)。
個(gè)別網(wǎng)絡(luò)資料上說(shuō)是可以操縱studio版本(2.3.2)導(dǎo)出的json文件(如果選擇語(yǔ)言是javascript的話),我在嘗試后發(fā)現(xiàn)基本不可以,但不是完全不可以。源碼分析發(fā)現(xiàn),這種方式導(dǎo)出的json文件與早期studio版本導(dǎo)出的exportjson文件或者json文件格式上存在很多的不一致。
因此,應(yīng)該明確的一點(diǎn)就是對(duì)于使用cocos2d-x 3.8.1 C++代碼操作的studio版本(2.3.2)導(dǎo)出的資源文件的擴(kuò)展名應(yīng)當(dāng)是.csb文件(二進(jìn)制文件)。
但是,工程cpp-tests中的確存在大量的操作早期版本場(chǎng)景文件、GUI圖層文件、骨骼動(dòng)畫(huà)文件的大量示例代碼,而官方文檔及這些文件注釋中又缺少必要的說(shuō)明,因此很容易誤導(dǎo)初學(xué)者,而致使其浪費(fèi)大量的時(shí)間進(jìn)行可行性編碼試驗(yàn)。
對(duì)于新版本環(huán)境下骨骼動(dòng)畫(huà)的操作我還沒(méi)有全面試驗(yàn),因此僅作部分試驗(yàn)結(jié)果說(shuō)明。
來(lái)自www.cocoachina.com的啟示
在上述網(wǎng)站的《Cocos骨骼動(dòng)畫(huà)功能解密》(http://www.cocoachina.com/cocos/20150907/13355.html)一文中我捕獲到如下最新的參考代碼。
12345678910111213141516171819202122232425262728 | SkeletonNode* skeletonNode = static_cast (CSLoader::createNode( "DemoPlayer.csb" )); skeletonNode->setScale(0.2f); skeletonNode->setPosition(150, 150); this ->addChild(skeletonNode); ActionTimeline* action = CSLoader::createTimeline( "DemoPlayer.csb" ); action->setTag(100); skeletonNode->runAction(action); action->play( "animation0" , false ); const std::string weapBoneName = "Layer20" ; auto weaponHandeBone = skeletonNode->getBoneNode(weapBoneName); 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 ); weaponHandeBone->displaySkin( "3" , true ); |
1 | Node *node=CSLoader::createNode( "DemoPlayer.csb" ); |
是3.8.1 c++代碼加載studio 2.3.2導(dǎo)出的各種.csb二進(jìn)制資源文件的統(tǒng)一方式。但是,根據(jù)本人浮淺分析:更細(xì)致的資料數(shù)據(jù)操縱示例工程中根本沒(méi)有提供。
初見(jiàn)天日
下面以我自己創(chuàng)建的一個(gè)簡(jiǎn)單示例來(lái)說(shuō)明如何從C++ 3.8.1代碼中操作studio 2.3.2導(dǎo)出的.csb文件。
首先,看一下我的示例工程截圖(我創(chuàng)建了一個(gè)場(chǎng)景文件MainScene.csd,其中加入的是一個(gè)骨骼動(dòng)畫(huà)文件):

骨骼動(dòng)畫(huà)文件是DemoPlayer.csd,如下,你一看就知道的。

接下來(lái),問(wèn)題的關(guān)鍵定位在:如何從cocos2d-x 3.8.1 c++代碼中操作上面導(dǎo)出的二進(jìn)制資源MainScene.csb,并進(jìn)而播放其中的骨骼動(dòng)畫(huà)以及進(jìn)行其他更細(xì)致的骨骼動(dòng)畫(huà)行為控制。
在分析了上面代碼提示和綜合cpp-tests工程代碼后,我作出如下大膽嘗試:
123456789 | 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中經(jīng)常有如下代碼:
1 | Node* _rootNode = SceneReader::getInstance()->createNodeWithSceneFile( "res/MainScene.json" ); |
恰巧,我的機(jī)器上有一個(gè)老版本的cocoStudio 1.4.0.1,其導(dǎo)出的場(chǎng)景文件正是json格式。試驗(yàn)證明,使用cocos2d-x c++ 3.8.1通過(guò)上述代碼操作場(chǎng)景文件非常順利。當(dāng)然,接下來(lái),相應(yīng)的進(jìn)一步操作場(chǎng)景中對(duì)象的代碼也是沒(méi)有問(wèn)題的,與示例工程中一致。
但是,簡(jiǎn)單地源碼跟蹤發(fā)現(xiàn),createNodeWithSceneFile文件也可以使用.csb文件作為參數(shù)。盡管沒(méi)有細(xì)致研究,但是試驗(yàn)證明下面的代碼根本是行不通的。
12 | Node* _rootNode = SceneReader::getInstance()->createNodeWithSceneFile( "res/MainScene.csb" ); Node* child = _rootNode->getChildByName( "ProjectNode_1" ); |
類似于上面的問(wèn)題,示例工程中還存在不少,希望研究的同學(xué)們小心注意了。
【補(bǔ)充】 在示例文件SceneEditorTest.cpp 中的確存在使用上述方法,即createNodeWithSceneFile加載.csb文件的情形。例如下面所示的函數(shù): 
注意,其中相關(guān)幫助函數(shù)loadFileChangeHelper代碼如下所示: 123456789101112131415161718192021 | 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中的一部分在我的機(jī)器上是順利調(diào)試通過(guò)的。也就是說(shuō),createNodeWithSceneFile的確能夠加載.csb文件,但卻不是cocos studio 2.3.2導(dǎo)出的.csb文件。據(jù)我的估計(jì),應(yīng)該是早期版本studio導(dǎo)出的.csb文件。 怎么樣?感覺(jué)有些麻煩吧。不同的.csb文件居然有的能夠通過(guò)createNodeWithSceneFile加載,而有的不行!遺憾的是,官方?jīng)]有給出明確說(shuō)明!!! |
小結(jié)
不敢多說(shuō)一些,因?yàn)槲业酱说慕Y(jié)論只停留在片面。但是,有一點(diǎn)基本是肯定的:當(dāng)前的CPP-TESTS中對(duì)于早期STUDIO資源操作提供的示例已經(jīng)非常豐富了,但相比之下,對(duì)于對(duì)應(yīng)最新版本的STUDIO導(dǎo)出的二進(jìn)制.csb文件的深入操作示例提供的非常欠缺。因此,這種情況下,要想使用最新版本的studio及相應(yīng)版本的cocos2d-x 3.x版本,深入研究SDK源碼是必需的;但同時(shí)也要結(jié)合網(wǎng)絡(luò)上盡可能新的示例(特別是來(lái)自于cocoachina.com網(wǎng)絡(luò)的資源)進(jìn)行。
登錄樂(lè)搏學(xué)院官網(wǎng)http://www.learnbo.com/
或關(guān)注我們的官方微博微信,還有更多驚喜哦~

本文出自 “青峰” 博客,請(qǐng)務(wù)必保留此出處http://zhuxianzhong.blog.51cto.com/157061/1713250