いちおくまんえん

最近はcocos2d-xでゲームアプリ「いちおくまんえん」の制作がメインです。 あとアニメも少々・・

cocos2d-xとCocosBuilderの連携方法③

一回二回に続いて今回はアニメーション関係の繋ぎ込み方法を紹介します。


ヘッダーや名前空間、機能の説明に直接関係しない処理などは省略しているので前回記事を読むなどして補完して下さい(´・ω・`)

アニメーションマネージャの取得と任意のタイミングで任意のタイムラインを再生する方法

MainScene.h

class MainScene :
    public cocos2d::CCLayer
{
public:
    CREATE_FUNC(MainScene);
    // メンバ変数にCocosBuilderで作成したアニメーションを割り当てる
    void setAnimationManager(cocos2d::extension::CCBAnimationManager *pAnimationManager);
    
private:
    cocos2d::extension::CCBAnimationManager *mAnimationManager;
};

MainScene.cpp

void MainScene::setAnimationManager(cocos2d::extension::CCBAnimationManager *pAnimationManager)
{
    CC_SAFE_RELEASE_NULL(mAnimationManager);
    mAnimationManager = pAnimationManager;
    CC_SAFE_RETAIN(mAnimationManager);
}

// 使い方の例(ヘッダーにも定義してないのでお好きなタイミングで呼び出されるものを用意してください)
// 前回のSelectorとの連携で紹介したボタンタップ時の処理に割り当てる方法が簡単かと思います。
void MainScene::defaultAnimationStart()
{
    // 0.3秒後にCocosBuilderで「Default Timeline」と名前をつけたアニメーションを再生する
    mAnimationManager->runAnimationsForSequenceNamedTweenDuration("Default Timeline", 0.3f);
    // 即時実行にはrunAnimationsForSequenceNamed("Default Timeline")でよいですが、結局↓の実装なので、
    // 0指定でrunAnimationsForSequenceNamedTweenDurationを使っておいたほうが後でディレイを
    // 付けたいといった時に修正が楽です。
    /* 参考
    void CCBAnimationManager::runAnimationsForSequenceNamed(const char *pName)
    {
        runAnimationsForSequenceNamedTweenDuration(pName, 0);
    }
    */
}

各アニメーションタイムライン完了時のコールバック処理を実装する方法

MainScene.h

// 継承するものが増えます
class MainScene :
    public cocos2d::CCLayer,
    public cocos2d::extension::CCBAnimationManagerDelegate
{
public:
    CREATE_FUNC(MainScene);
    // メンバ変数にCocosBuilderで作成したアニメーションを割り当てる
    // と同時にアニメーション終了時にコールバックをセットするデリゲートをセットする
    void setAnimationManager(cocos2d::extension::CCBAnimationManager *pAnimationManager);
    // アニメーション完了時にタイムライン名が引数として実行される
    virtual void completedAnimationSequenceNamed(const char *name);
    
private:
    cocos2d::extension::CCBAnimationManager *mAnimationManager;
};

MainScene.cpp

void MainScene::setAnimationManager(cocos2d::extension::CCBAnimationManager *pAnimationManager)
{
    CC_SAFE_RELEASE_NULL(mAnimationManager);
    mAnimationManager = pAnimationManager;
    CC_SAFE_RETAIN(mAnimationManager);

    // ここが追加される
    mAnimationManager->setDelegate(this);
}

// アニメーション終了時の処理
void MainScene::completedAnimationSequenceNamed(const char *name)
{
    // タイムラインの名前によって処理を分ける。必要のあるものだけ指定すればOK
    if(strcmp(name,"Last") == 0)
    {
        // replaceSceneとか
    }
}


以上!

これで基本的な部分は連携できるようになったと思います( ・`д・´)


あと2つ程近いうちにCocosBuilderとの連携について、また記事書くと思いますが、
そんなに使うこともない気がするので、あまり期待せずにお待ちください(・∀・)


※ 2013/10/13追記
申し訳ない。。アニメーションマネージャーのセット処理が抜けてました。

CCNodeLoaderLibrary* pNodeLoaderLibrary = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary();
pNodeLoaderLibrary->registerCCNodeLoader("MainScene", MainSceneLoader::loader());

CCBReader* pReader = new CCBReader(pNodeLoaderLibrary);
CCNode * pNode = pReader->readNodeGraphFromFile("MainScene.ccbi");
MainScene* pLayer = (MainScene*)pNode;
// これをして上げて下さい(´・ω・`)
pLayer->setAnimationManager(pReader->getAnimationManager())
pReader->release();