国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

cocos2d-x 3.8.1的骨骼動(dòng)畫(huà)加載方法addArmatureFileInfo仍然存在問(wèn)題

2019-11-11 03:27:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

提出如題所示的問(wèn)題,心里非常別扭,但的確是事實(shí)。因此,Cocos Studio(我目前使用的是 2.3.2)在許多方面還有改進(jìn)的地方,包括與之相對(duì)應(yīng)的cocos2d-x中的代碼操作部分。

   

問(wèn)題

        目前,我的試驗(yàn)結(jié)果發(fā)現(xiàn),使用cocos2d-x 3.8.1中提供的如下方法:

1ArmatureDataManager::getInstance()->addArmatureFileInfo(filename);

        無(wú)法正常加載Cocos Studio 2.3.2導(dǎo)出的骨骼動(dòng)畫(huà)資源文件。例如如下代碼無(wú)法正常通過(guò)項(xiàng)目構(gòu)建:

1ArmatureDataManager::getInstance()->addArmatureFileInfo("DemoPlayer.csb");

令人遺憾的例子

 

盡管如此,但是cocos2d-x 3.8.1的cpp-tests實(shí)例中的確提供了使用addArmatureFileInfo方法加載.csb骨骼動(dòng)畫(huà)文件的例子!!

 

是的,因?yàn)?csb文件是二進(jìn)制格式,目前還找不到其反編譯工具,但是,從使用簡(jiǎn)單的工具分析,cpp-tests實(shí)例中提供的示例.csb骨骼動(dòng)畫(huà)文件的版本與Cocos Studio 2.3.2導(dǎo)出的骨骼動(dòng)畫(huà)資源文件.csb并不一致。

 

下面給出Notepad++觀察到的結(jié)果圖的對(duì)照(第1張是Cocos Studio 2.3.2導(dǎo)出骨骼動(dòng)畫(huà)文件DemoPlayer.csb查看結(jié)果,顯然版本號(hào)是2.1.0.0,第2張是cpp-tests實(shí)例中提供的示例Cowboy.csb骨骼動(dòng)畫(huà)文件查看結(jié)果,顯然版本號(hào)是1.0.1):

 

wKioL1ZLIqGBpW75AALR_GQJDyo639.jpg

 

wKiom1ZLIxmC3MHpAAQDiObULoI450.jpg

 

為了進(jìn)一步分析上述問(wèn)題,我還專門把cocos2d-x 3.8.1的cpp-tests實(shí)例中提供的使用addArmatureFileInfo方法加載其提供的相應(yīng).csb骨骼動(dòng)畫(huà)文件的代碼復(fù)制到一個(gè)簡(jiǎn)單示例工程中進(jìn)行測(cè)試,的確OK。相關(guān)代碼如下所示:

1234567891011const  char* HelloWorld::m_binaryFilesNames[4] = { "bear.csb""horse.csb","Cowboy.csb","ccc.csb"};const  char* HelloWorld::m_armatureNames[4] = { "bear""horse","Cowboy","Skeleton1"};//...... // load from binary ArmatureDataManager::getInstance()->addArmatureFileInfo(m_binaryFilesNames[3]); Armature *m_armature = Armature::create(m_armatureNames[3]); m_armature->getAnimation()->playWithIndex(0); m_armature->setScale(1.0f); Size size = Director::getInstance()->getWinSize(); m_armature->setPosition(size.width/2, size.height/2); addChild(m_armature);

對(duì)于數(shù)組中相應(yīng)的前三個(gè).csb文件(應(yīng)該是老版本的STUDIO導(dǎo)出的骨骼動(dòng)畫(huà)csb文件),運(yùn)行上述代碼非常順利(當(dāng)然,上述addArmatureFileInfo方法調(diào)用更早的ExportJson骨骼動(dòng)畫(huà)文件的情況也是能夠順利運(yùn)行)。事實(shí)上,cpp-tests自然也已經(jīng)在我的機(jī)器上順序調(diào)試通過(guò)(我的環(huán)境是Windows 7 64bits Visual Studio 2013)。但是,對(duì)于最后那個(gè)csb文件(使用當(dāng)前新版本Cocos Studio 2.3.2導(dǎo)出的骨骼動(dòng)畫(huà)文件),則根本不行,執(zhí)行中斷停止在addArmatureFileInfo調(diào)用的下一行。

 

在經(jīng)過(guò)部分的源碼跟蹤后,我嘗試著使用碎圖技術(shù)生成csb文件,盡量使之與cpp-tests提供的文件形式上一致,結(jié)果也根本通不過(guò)!

 

太遺憾了,我就是想使用Armature及相應(yīng)的如下技術(shù):

1   armature->getAnimation()->setMovementEventCallFunc(CC_CALLBACK_0(TestAnimationEvent::animationEvent, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));

但是,很遺憾,只能干瞪眼!沒(méi)有Armature,我們根本無(wú)法使用setMovementEventCallFunc回調(diào)函數(shù)及其相應(yīng)技術(shù)了。

 

遺憾的是,對(duì)于上述問(wèn)題,官方網(wǎng)站上及DEMO中只字未提!

 

變通辦法

 

對(duì)于我目前的程序中的上述要求,我只能嘗試著其他的變通方法,因?yàn)槲业囊笠膊⒉桓摺S谑俏覈L試著使用幀事件方法解決了上述問(wèn)題。

 

在此,我粘貼上我的示例游戲中的相關(guān)代碼。

第一部分如下:

1234567891011121314151617 //2load title and mushroom animation  Node* node2 = CSLoader::createNode("SplashAnimationSkeleton.csb");  addChild(node2);  node2->setPosition(Vec2(VisibleRect::center().x, VisibleRect::center().y));  //在cocos studio設(shè)計(jì)器中選擇是否循環(huán)播放,對(duì)于在代碼中動(dòng)畫(huà)的是否循環(huán)播放沒(méi)有影響!!!//  ActionTimeline* action2 = CSLoader::createTimeline("SplashAnimationSkeleton.csb");  node2->runAction(action2);  action2->gotoFrameAndPlay(0,false);  action2->setFrameEventCallFunc(CC_CALLBACK_1(SplashScene::onFrameEvent, this));

 

注意,上面的SplashAnimationSkeleton.csb是使用cocos studio 2.3.2創(chuàng)建的簡(jiǎn)單的骨骼動(dòng)畫(huà)文件。

 

我原先設(shè)計(jì)的使用setMovementEventCallFunc方法結(jié)合Armature數(shù)據(jù)想實(shí)現(xiàn)的是目標(biāo)是:當(dāng)骨骼動(dòng)畫(huà)播放結(jié)束,觸發(fā)另一個(gè)既定事件,并在這個(gè)事件中完成另外的動(dòng)畫(huà)播放任務(wù)。

 

對(duì)于上述目標(biāo),使用幀事件應(yīng)該是可以的,只是稍微麻煩一些罷了。例如,需要在studio設(shè)計(jì)器中填寫幀事件數(shù)據(jù);但是,總算還可以實(shí)現(xiàn)。

另外一部分相關(guān)代碼如下:

12345678910111213141516171819202122void SplashScene::onFrameEvent(Frame* frame){ EventFrame* evnt = dynamic_cast<EventFrame*>(frame); if (!evnt)  return; std::string str = evnt->getEvent(); if (str == "lastFrame") {  Node* butterfly_01 = CSLoader::createNode("ButterflyArmature_01.csb");  addChild(butterfly_01,100);  butterfly_01->setPosition(Vec2(VisibleRect::right().x + 100, 0));  ActionTimeline* action2 = CSLoader::createTimeline("ButterflyArmature_01.csb");  butterfly_01->runAction(action2);  action2->gotoFrameAndPlay(0, true);  Node* p1 = _rootLayer->getChildByName("Mushroom_Point");  auto  action = Sequence::create(   MoveTo::create(2, p1->getPosition()),   CallFunc::create(CC_CALLBACK_0(SplashScene::callback0, this)),   nullptr);  butterfly_01->runAction(action); }}

大家看到,我在幀事件回調(diào)函數(shù)中進(jìn)行判斷,當(dāng)動(dòng)畫(huà)播放到特定幀時(shí)(正是我以前要求的第一個(gè)動(dòng)畫(huà)播放結(jié)束時(shí))觸發(fā)另一個(gè)蝴蝶飛入動(dòng)畫(huà)的播放。 

小結(jié)一下

 

通過(guò)學(xué)習(xí)與研究部分cocos2d-x 及cocos studio最新版本技術(shù)可以學(xué)習(xí)到更優(yōu)秀的開(kāi)發(fā)技術(shù)的同時(shí),注定我要犧牲許多時(shí)間去“踏坑”,也許有得就有失吧。

最后,再提醒一下新手同學(xué),示例工程中的代碼部分與資源數(shù)據(jù)文件部分都有些不太明確的調(diào)用,當(dāng)然,看起來(lái)官方是要盡量使用最新的c++代碼來(lái)使用(或者說(shuō)保護(hù))早期studio導(dǎo)出的資源。但在同時(shí),卻露出了不少急于求成的“馬腳”。

登錄樂(lè)搏學(xué)院官網(wǎng)http://www.learnbo.com/

或關(guān)注我們的官方微博微信,還有更多驚喜哦~

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 泸水县| 湘潭县| 凤城市| 和政县| 延津县| 九江县| 包头市| 车致| 金山区| 庆城县| 龙川县| 太原市| 龙州县| 珠海市| 芜湖市| 安义县| 枣庄市| 峨山| 涡阳县| 阿坝| 台南市| 民权县| 尉氏县| 克东县| 伊金霍洛旗| 丰镇市| 巴林左旗| 左云县| 佛冈县| 霍州市| 嵩明县| 新丰县| 靖州| 偃师市| 罗山县| 吴川市| 安溪县| 洪湖市| 定兴县| 文成县| 江西省|