【教程】如何在2d-x中載入CocosStudio2.0版本生成的資料

峻峰飛陽發表於2016-11-02
使用Studio2.0釋出的CSB資源更換了載入方式,需要用CSLoader來載入。CSLoader在Cocos2d-x3.3RC0開始提供。
以下提供的是C++的程式碼,
lua、js的介面是一樣的。只有一點區別:
CSLoader在lua中對應cc.CSLoader
在js中對應ccs.csLoader (在2d-js3.1RC0中需要做點修改


#include "ui/CocosGUI.h"//UI相關的標頭檔案
#include"cocostudio/CocoStudio.h"//在CocosStudio.h 標頭檔案中已經包含了Studio所需要的各個標頭檔案(除CocosGUI)因此我們使用Studio僅
需要包含他就可以
using namespace cocos2d;//CSLoader位於cocos2d名稱空間。
using namespace cocostudio::timeline;//動畫相關的類位於cocostuio::timeline當中


void myScene::initFunc()
{
    //以下是載入相關的程式碼:
    Node *rootNode = CSLoader::createNode("MainScene.csb");//傳入Studio2.x的資源路徑
    this->addChild(rootNode);//假設this是即將顯示的scene

    //載入動畫:
    ActionTimeline *action = CSLoader::createTimeline("MainScene.csb");
    rootNode->runAction(action);

    //注!!!:同一個檔案建立的節點只能使用同一個檔案建立的動畫。
//巢狀節點的動畫會自動載入動畫,可以用巢狀節點->getActionByTag(巢狀節點->getTag()) 來獲取動畫


    //播放動畫:
    action->gotoFrameAndPlay(0,60,true);//從第0幀到60幀迴圈播放。還有其他過載函式,具體看原始碼。


    //幀事件監聽
    action->setFrameEventCallFunc(CC_CALLBACK_1(myScene::onFrameEvent, this));
    //關於CC_CALLBACK_1需要點C++11的基礎才能知道是咋回事,這裡只要照著寫就行。想了解可以查下std::Bind

   //幀事件是可以檢測到最後一幀的事件的,已測3.6


   //動畫結束偵聽
   action->setLastFrameCallFunc(CC_CALLBACK_0(myScene::AnimationEnd, this));
  //可以幀聽到,親測3.6。
}
void myScene::onFrameEvent(Frame* frame)//固定的格式
{
    EventFrame* evnt = dynamic_cast<EventFrame*>(frame);
    if(!evnt)
        return;


    std::string str = evnt->getEvent();
    if (str == "xxoo")
    {
        CCLOG("come on baby");
    }
}



void XXX::AnimationEnd()
{
CCLOG("animation end");
}



注:

1. 不會看原始碼的碼農不是好程式猿啊。經常有人求某個API介面,這東西查查標頭檔案看介面名就能知道個大概啦。原始碼就是最權威的API文件啊有木有!!!
2. 2.x版本Studio匯出的CSB資源需要與2d-x嚴格對應(具體看這裡(估計以後會提供與2d-x解耦的方法。)
3. CocosStudio v2.x 假定在編輯器裡邊的資源目錄即遊戲的最終的目錄結構,因而如果你修改了匯出資源的目錄則需要編輯器目錄也需要跟著修改。也可以用addSearchPath來把你的路徑新增到FileUtils中,但要小心檔名衝突。


PS:我已經在3.6親自測試過了,如果還是偵聽不到幀事件,請先測試下面的資原始檔和程式碼,謝謝。

相關文章