溫馨提示×

溫馨提示×

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

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

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

發(fā)布時(shí)間:2020-06-29 20:06:57 來源:網(wǎng)絡(luò) 閱讀:11424 作者:googlingman 欄目:游戲開發(fā)

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

引子

這段時(shí)間一直努力在把早期版本的拇指接龍游戲(Cocos2d-x 2.2.3+CocoStudio 1.4.0.1)升級到當(dāng)前相對穩(wěn)定的高大上環(huán)境——Cocos2d-x 3.8.1+Cocos Studio 2.3.2。行程中遇到不少麻煩,時(shí)間不知不覺像流水一樣悄然逝去(這正是我時(shí)不時(shí)酸酸地想起“程序猿”三字的主要原因)。想之再三,還是努力記錄下來,一來為自己可能逝去的記憶,二來為一些新伙伴少踏幾個(gè)坑而節(jié)約些許時(shí)間。

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

cpp-tests中的誤導(dǎo)

在升級之前就從網(wǎng)絡(luò)上及部分手頭圖書中了解到cocos2d-x 3.x版本中的較大變動(dòng)。于是,還是很小心地決定先從研讀新版本發(fā)行中相伴隨的最經(jīng)典的示例工程cpp-tests開始。在有了一個(gè)整體思路后,結(jié)合原來版本代碼開始更新,有的是代碼部分,有的是studio圖形數(shù)據(jù)部分,當(dāng)然也包括該示例游戲涉及的有米積分墻SDK相關(guān)代碼的更新與ShareSDK集成部分的更新。

網(wǎng)絡(luò)搜索及研究示例工程cpp-tests的結(jié)果表明,官方的文檔有不少已經(jīng)過時(shí)。但是,值得肯定的一點(diǎn)是工程cpp-tests中提倡盡量使用當(dāng)前最新的cocos2d-x代碼操縱早期幾乎是各種版本studio導(dǎo)出的資源文件,還包括Flash動(dòng)畫文件及Spine動(dòng)畫文件,等等。

但遺憾的是,相應(yīng)的官方資料中并沒有指出這一點(diǎn)。當(dāng)然,在示例工程注釋中也沒有必要過于瑣碎地添加這種使用說明信息。

于是,對于像我這樣的新版本的發(fā)燒友來說,要使用其提供的最新技術(shù)主要有兩個(gè)途徑:一個(gè)是盡量全面地查看官方文檔(但是最新版本有關(guān)資料少得可憐),再一個(gè)就是閱讀SDK源碼。

如題中所示的“誤導(dǎo)”部分地體現(xiàn)在當(dāng)前最新的cocos2d-x c++代碼操縱studio導(dǎo)出的動(dòng)畫資源文件方面。

如果選擇開發(fā)語言是c++,那么對應(yīng)的studio版本(2.3.2)的資料文件只能是.csb文件(場景文件、圖層文件、結(jié)點(diǎn)文件、骨骼動(dòng)畫文件、3D場景文件的擴(kuò)展名都是.csb)。

個(gè)別網(wǎng)絡(luò)資料上說是可以操縱studio版本(2.3.2)導(dǎo)出的json文件(如果選擇語言是javascript的話),我在嘗試后發(fā)現(xiàn)基本不可以,但不是完全不可以。源碼分析發(fā)現(xiàn),這種方式導(dǎo)出的json文件與早期studio版本導(dǎo)出的exportjson文件或者json文件格式上存在很多的不一致。

因此,應(yīng)該明確的一點(diǎn)就是對于使用cocos2d-x 3.8.1 C++代碼操作的studio版本(2.3.2)導(dǎo)出的資源文件的擴(kuò)展名應(yīng)當(dāng)是.csb文件(二進(jìn)制文件)。

但是,工程cpp-tests中的確存在大量的操作早期版本場景文件、GUI圖層文件、骨骼動(dòng)畫文件的大量示例代碼,而官方文檔及這些文件注釋中又缺少必要的說明,因此很容易誤導(dǎo)初學(xué)者,而致使其浪費(fèi)大量的時(shí)間進(jìn)行可行性編碼試驗(yàn)。

對于新版本環(huán)境下骨骼動(dòng)畫的操作我還沒有全面試驗(yàn),因此僅作部分試驗(yàn)結(jié)果說明。

來自www.cocoachina.com的啟示

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

//首先通過CSLoader讀入Cocos編輯器導(dǎo)出的csb文件,并將CSLoader返回的Node轉(zhuǎn)換為SkeletonNode*類型
SkeletonNode* skeletonNode = static_cast(CSLoader::createNode("DemoPlayer.csb"));
//獲得到骨骼節(jié)點(diǎn)之后,可以對骨骼節(jié)點(diǎn)的Scale、Position等進(jìn)行設(shè)置
skeletonNode->setScale(0.2f);
skeletonNode->setPosition(150, 150);
//然后將骨骼節(jié)點(diǎn)添加到父節(jié)點(diǎn)上
this->addChild(skeletonNode);
//接下來,再次通過CSLoader讀入Cocos編輯器導(dǎo)出的csb文件,創(chuàng)建一個(gè)ActionTimeline對象,這個(gè)對象存儲著骨骼節(jié)點(diǎn)的所有動(dòng)畫
ActionTimeline* action = CSLoader::createTimeline("DemoPlayer.csb");
//我們?yōu)楣趋拦?jié)點(diǎn)的動(dòng)畫設(shè)置一個(gè)tag值方便后邊取出動(dòng)畫,建議這里使用枚舉的形式來定義tag值(為了方便這里直接寫100了)
action->setTag(100);
skeletonNode->runAction(action);
//播放action中的動(dòng)畫(參數(shù)1:動(dòng)畫名稱   參數(shù)2:是否循環(huán)播放)
action->play("animation0", false);
//我們可以通過每個(gè)骨骼節(jié)點(diǎn)上邊的某個(gè)皮膚(圖片)的名字來獲取這"塊"骨骼
const std::string weapBoneName = "Layer20";
auto weaponHandeBone = skeletonNode->getBoneNode(weapBoneName);
//我們可以創(chuàng)建一個(gè)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);
//當(dāng)然也可以換回原來的("3"指的是"3.png"原先皮膚的名字)
weaponHandeBone->displaySkin("3", true);
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ù)操縱示例工程中根本沒有提供。

 

初見天日

下面以我自己創(chuàng)建的一個(gè)簡單示例來說明如何從C++ 3.8.1代碼中操作studio 2.3.2導(dǎo)出的.csb文件。

首先,看一下我的示例工程截圖(我創(chuàng)建了一個(gè)場景文件MainScene.csd,其中加入的是一個(gè)骨骼動(dòng)畫文件):

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

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

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

接下來,問題的關(guān)鍵定位在:如何從cocos2d-x 3.8.1 c++代碼中操作上面導(dǎo)出的二進(jìn)制資源MainScene.csb,并進(jìn)而播放其中的骨骼動(dòng)畫以及進(jìn)行其他更細(xì)致的骨骼動(dòng)畫行為控制。

在分析了上面代碼提示和綜合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中經(jīng)常有如下代碼:

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

恰巧,我的機(jī)器上有一個(gè)老版本的cocoStudio 1.4.0.1,其導(dǎo)出的場景文件正是json格式。試驗(yàn)證明,使用cocos2d-x c++ 3.8.1通過上述代碼操作場景文件非常順利。當(dāng)然,接下來,相應(yīng)的進(jìn)一步操作場景中對象的代碼也是沒有問題的,與示例工程中一致。

但是,簡單地源碼跟蹤發(fā)現(xiàn),createNodeWithSceneFile文件也可以使用.csb文件作為參數(shù)。盡管沒有細(xì)致研究,但是試驗(yàn)證明下面的代碼根本是行不通的。

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

類似于上面的問題,示例工程中還存在不少,希望研究的同學(xué)們小心注意了。

 

 

【補(bǔ)充】

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

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

 

注意,其中相關(guān)幫助函數(shù)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中的一部分在我的機(jī)器上是順利調(diào)試通過的。也就是說,createNodeWithSceneFile的確能夠加載.csb文件,但卻不是cocos studio 2.3.2導(dǎo)出的.csb文件。據(jù)我的估計(jì),應(yīng)該是早期版本studio導(dǎo)出的.csb文件。

 

怎么樣?感覺有些麻煩吧。不同的.csb文件居然有的能夠通過createNodeWithSceneFile加載,而有的不行!遺憾的是,官方?jīng)]有給出明確說明?。?!

 

 

 

 

小小結(jié)

不敢多說一些,因?yàn)槲业酱说慕Y(jié)論只停留在片面。但是,有一點(diǎn)基本是肯定的:當(dāng)前的CPP-TESTS中對于早期STUDIO資源操作提供的示例已經(jīng)非常豐富了,但相比之下,對于對應(yīng)最新版本的STUDIO導(dǎo)出的二進(jìn)制.csb文件的深入操作示例提供的非常欠缺。因此,這種情況下,要想使用最新版本的studio及相應(yīng)版本的cocos2d-x 3.x版本,深入研究SDK源碼是必需的;但同時(shí)也要結(jié)合網(wǎng)絡(luò)上盡可能新的示例(特別是來自于cocoachina.com網(wǎng)絡(luò)的資源)進(jìn)行。

 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI