cocosBuilderはcbbiファイルを生成し、cococos 2 d-xにバインドする

3366 ワード

今日は一日やったので、記録しておきます.
まずバージョンです.私が使っているcocosBuilder 3とcococos 2 d-x 2.1.2です.親測定cocosBuilder 2と最新バージョンのcocos 2 d-xは互換性がありません.
WARNINGと間違えました!Incompatible ccbi file version (file: 3 reader: 5).cocosBuilder 3にアップグレードし、XCodeとVS 2012のテストは問題ありません.
このシステムの原理は、まずcocosBuilderでそのファイルXXXに編集することです.ccb.その後、リリースされるファイルはccbiです.
cococos 2 dシステムにはCCBReaderライブラリがあり、ccbiファイルの情報をcococos 2 d-xが理解できるフォーマットに解読することができる.
しかし、事は想像していたほど美しくなく、花が牛の糞に刺さっているようだ.ccbiファイルがプログラムに読み込まれる過程は本当に気持ち悪い.
文句を言わないで、本題を言います.
まず、CCLayerのサブクラスを自分で書き、CCBSelectorResolverとCCBMemberVariableAssignerをそれぞれ継承します.
この2つのダミーベースクラスのインタフェースを実現します.また、CREATE_も書きます.FUNNCメソッドは、次のステップで使用されます.例:
class MyLayer:public CCLayer,public CCBSelectorResolver,public CCBMemberVariableAssigner{
    
public:
    CREATE_FUNC(MyLayer);
    void enterPlay(CCObject *pSender);  
    void pressTitle(CCObject *pSender, CCControlEvent pCCControlEvent);

    
public:
    //CCBSelectorResolver
    virtual SEL_MenuHandler onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName) ;
    virtual SEL_CCControlHandler onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName) ;
	
    //CCBMemberVariableAssigner
    virtual bool onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode);
    
};

は、次いで、各Layerに対応して、さらに1つのLoderを書く.LoaderはCCLayerLoaderから継承されます.2つのことをする必要があります1、loaderメソッドを作成します.2、Loaderを対応するLayerに関連付ける.例:
class MyLayerLoder :public CCLayerLoader{
    
    
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(MyLayer, loader);
    
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(MyLayer);
    
};

では、定義を完了します.次は実現です.
対応する登録関数に関連付けを登録します.CCB_の使用SELECTORRESOLVER_CCMENUITEM_GLUE、 CCB_SELECTORRESOLVER_CCCONTROL_GLUE、 CCB_MEMBERVARIABLEASSIGNER_GLUEマクロは、対応する登録を完了する.例:
SEL_MenuHandler MyLayer::onResolveCCBCCMenuItemSelector(CCObject * pTarget, const char* pSelectorName)
{
	CCB_SELECTORRESOLVER_CCMENUITEM_GLUE( this, "pressPlay", MyLayer::enterPlay);
	return NULL;
}

// :void pressTitle(CCObject *pSender);
SEL_CCControlHandler MyLayer::onResolveCCBCCControlSelector(CCObject * pTarget, const char* pSelectorName)  
{  
    CCB_SELECTORRESOLVER_CCCONTROL_GLUE( this, "pressTitle", MyLayer::controlButtonTest);  
    return NULL;  
}  

bool MyLayer::onAssignCCBMemberVariable(CCObject* pTarget, const char* pMemberVariableName, CCNode* pNode)
{
	CCB_MEMBERVARIABLEASSIGNER_GLUE( this, "helloLabel", CCLabelTTF*, helloLabel);
	return false;
}

最後に、読み込み呼び出しです.まず、対応するLayerとLoaderをCCNodeLoaderLibraryに登録します.そしてCCBReaderで読みます.最後にreaderを呼び出す対応するメソッドは、リソースを解析します.たとえば
 CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary()->registerCCNodeLoader( "MyLayer", MyLayerLoder::loader());
 CCBReader* reader = new CCBReader( CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary() );
 reader->autorelease();    // run
 pDirector->runWithScene(reader->createSceneWithNodeGraphFromFile("MyLayer"));
    

そうですね.問題は、それぞれ書くか、書くか、それとも2つ(layerとLoader)かです.このコードを見ていると本当に気分が悪い.夜家に帰って、何かいい方法があるかどうか考えてみましょう.
上のコードの山に対して、Good Luck For You.
このブログは阿修罗道から出ています.転載は出典を明記してください.http://blog.csdn.net/fansongy/article/details/8860630