cocos2d-xとCocosBuilderの連携方法②
前回に続いて今回は変数やSelectorとの繋ぎ込み方法を紹介します。
そういえば前回バージョンなど書いてませんでしたね。
この記事で紹介する書き方は以下の環境でのものになります。
cocos2d-x : 2.1.4
CocosBuilder : 3.0-alpha5
少し前のバージョンは変数やSelectorの名前をCCStringで渡してたりしてたようです。
そういえばcocos2d-xのバージョンも3のα版が数日前に出てましたね。
書き方また変わってるのかな(´・ω・`)
cocos2d-xのメジャーバージョンアップについてはまた別の記事で書きます。
ということで連携方法ですが、1つずついきますね。
今回の例ではMainSceneというカスタムクラス名のCCLayerがルートのccbiファイルを取り込みます。
まずは共通項目
ローダークラスの作成
MainSceneLoader.h
#include "cocos2d.h" #include "cocos-ext.h" class MainSceneLoader : public cocos2d::extension::CCLayerLoader { public: // 通常は↓のマクロで良いけどなにしてるのか分かるように展開 // CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MainSceneLoader, loader); // ↓ static MainSceneLoader* loader() { MainSceneLoader* ptr = new MainSceneLoader(); if(ptr != NULL) { ptr->autorelease(); return ptr; } // またマクロが出てくるので展開して表示 // CC_SAFE_DELETE(ptr); // ↓ // do { if(p) { delete (p); (p) = 0; } } while(0) // ↓ if(ptr) { delete (ptr); (ptr) = 0; } return NULL; } protected: // CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MainScene); // ↓ virtual MainScene* createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader) { return MainScene::create(); } };
C++最近触り始めたんですが、こんなにマクロ使うもんなんですかね・・・
分かってる人には省略できるので楽なんでしょうが初めて触る時追っかけて理解するのが大変だ('A`)
このローダークラスもカスタムクラス名が変わるだけなので、マクロで作って利用するのもいいかもしれません。
1クラス1ファイルとかの運用ルールがあるならあれですが。
ローダークラスを使ってccbiファイルを読み込む
CCNodeLoaderLibrary* pNodeLoaderLibrary = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary(); // 何も繋ぎこまない場合に対してこの一行が増える pNodeLoaderLibrary->registerCCNodeLoader("MainScene", MainSceneLoader::loader()); CCBReader* pReader = new CCBReader(pNodeLoaderLibrary); CCNode * pNode = pReader->readNodeGraphFromFile("MainScene.ccbi"); MainScene* pLayer = (MainScene*)pNode; pReader->release();
ここからは必要なものを継承して使います
変数名のノードを繋ぐ
MainScene.h
#include "cocos2d.h" #include "cocos-ext.h" class MainScene : public cocos2d::CCLayer, public cocos2d::extension::CCBMemberVariableAssigner { public: CREATE_FUNC(MainScene); virtual bool onAssignCCBMemberVariable(cocos2d::CCObject* pTarget, const char* pMemberVariableName, cocos2d::CCNode* pNode); private: cocos2d::CCLabelTTF* mHelloLabel; };
MainScene.cpp
#include "MainScene.h" USING_NS_CC; USING_NS_CC_EXT; bool MainScene::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode) { // CocosBuilderで設定した変数名helloLabelのCCLabelTTFをcocos2d-xのメンバ変数mHelloLabelにセットする // CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "helloLabel", CCLabelTTF*, mHelloLabel); // ↓ if (pTarget == this && 0 == strcmp(pMemberVariableName, ("helloLabel"))) { CCLabelTTF* pOldVar = mHelloLabel; mHelloLabel = dynamic_cast<CCLabelTTF*>(pNode); CC_ASSERT(mHelloLabel); if (pOldVar != mHelloLabel) { CC_SAFE_RELEASE(pOldVar); mHelloLabel->retain(); } return true; } // マクロ return false; }
Selectorを繋ぐ
MainScene.h
class MainScene : public cocos2d::CCLayer, public cocos2d::extension::CCBSelectorResolver { public: CREATE_FUNC(MainScene); // CCMenuItemにセットしたSelectorを割り当てる virtual cocos2d::SEL_MenuHandler onResolveCCBCCMenuItemSelector(cocos2d::CCObject* pTarget, const char* pSelectorName); // CCControlにセットしたSelectorを割り当てる virtual cocos2d::extension::SEL_CCControlHandler onResolveCCBCCControlSelector(cocos2d::CCObject* pTarget, const char* pSelectorName); private: void onPressButton(CCObject* pSender, cocos2d::extension::CCControlEvent nCCControlEvent); void onPressButton2(CCObject* pSender, cocos2d::extension::CCControlEvent nCCControlEvent); };
MainScene.cpp
SEL_MenuHandler MainScene::onResolveCCBCCMenuItemSelector(cocos2d::CCObject *pTarget, const char* pSelectorName) { CCB_SELECTORRESOLVER_CCMENUITEM_GLUE(this, "onPressButton", MainScene::onPressButton); return NULL; } SEL_CCControlHandler MainScene::onResolveCCBCCControlSelector(cocos2d::CCObject *pTarget, const char* pSelectorName) { CCB_SELECTORRESOLVER_CCCONTROL_GLUE(this, "onPressButton2", MainScene::onPressButton2); return NULL; } void MainScene::onPressButton(CCObject *pSender, CCControlEvent nCCControlEvent) { CCLOG("onPressButton"); } void MainScene::onPressButton2(CCObject *pSender, CCControlEvent pCCControlEvent) { CCLOG("onPressButton2"); }
2回目なのでインクルードとか名前空間など省いてますが必要です。
( ゚д゚)ハッ!またしてもこんな時間!
なのでマクロの展開とか省略!省略!
変数の繋ぎ込みと似たような感じなので特に説明は要らないでしょう。
ということにしておこう!
基本的に変数とSelectorが繋げられればある程度のことは出来ると思います。
でもまだあるんです。
次はアニメーションの操作やアニメーション完了時のコールバックを受けたりといったことを紹介します。
また数日中に更新するのでお楽しみにヽ( ´ ∇ ` )ノ