0

メインの「ccb」ファイル(cocos2d-x)のカスタムレイヤークラスから、サブccbで定義されたメンバー変数にアクセスするにはどうすればよいですか?

この質問の基本シナリオは次のとおりです。


「ladybirds_page.ccb」という名前のCCBファイルがあり、カスタムローダークラスを次のように関連付けます(ルートはCCLayerです)

  • ladybirds_pageLayerLoader.h
  • ladybirds_pageLayer.h
  • ladybirds_pageLayer.cpp

「ladybird.ccb」という名前の別のCCBファイルがあり、カスタムローダークラスを次のように関連付けます(ルートはCCNodeです)

  • ladybirdLoader.h
  • テントウムシ.h
  • ladybird.cpp

「ladybirds_page.ccb」ファイルには、「ladybird.ccb」のインスタンスがいくつか含まれています。そして、それらは関連するメンバー変数(mLadyBird_1、mLadyBird_2、..)に関連付けられています。

「ladybird.ccb」自体には、メンバー変数(mDotSprite_1、mDotSprite_2、...)に関連付けられたいくつかのCCSpriteが含まれています。

インスタンスごとに、これらのsub-ccb(ladyBird)のメンバー変数へのアクセスを取得したいと思います。好き

  • mLadyBird_1-> mDotSprite_1
  • mLadyBird_1-> mDotSprite_2

これがこれまでの私のコーディングアプローチです、

次のように、ladyBird.cppにメソッド名setNumber(int num)を作成します。

void ladybird::setNumber(int num)
{
    .......
    .........
    mDotSprite_1->setVisible(false);
    mDotSprite_1->setVisible(false);
    ......

}

mDotSprite_1とmDotSprite_1は、CCB_MEMBERVARIABLEASSIGNER_GLUEマクロを使用して割り当てられました

CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mDotSprite_1", CCSprite *, this->mDotSprite_1);
CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mDotSprite_1", CCSprite *, this->mDotSprite_1);

カスタムローダークラスを使用してladybirds_page.ccbファイルをロードする

void intro_pageLayer::loadNextPage()
{

    /* Create an autorelease CCNodeLoaderLibrary. */
    CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();

    ccNodeLoaderLibrary->registerCCNodeLoader("ladybird", ladybirdLoader::loader());
    ccNodeLoaderLibrary->registerCCNodeLoader("ladybirds_pageLayer", ladybirds_pageLayerLoader::loader());


    /* Create an autorelease CCBReader. */
    cocos2d::extension::CCBReader * ccbReader = new cocos2d::extension::CCBReader(ccNodeLoaderLibrary);


    /* Read a ccbi file. */
    CCNode * node = ccbReader->readNodeGraphFromFile("ccb/ladybirds_page.ccbi", this);

    ccbReader->release();

    CCScene * scene = CCScene::create();
    if(node != NULL) {
        scene->addChild(node);
    }

    /* Push the new scene with a fancy transition. */

    CCDirector::sharedDirector()->pushScene(CCTransitionPageTurn::create(0.5f, scene, false));
}

ladybirds_pageLayer.cppでladyBirdsのインスタンスのメンバー変数を割り当てます

 CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mLadyBird_1", ladybird *, this->mLadyBird_1);
 CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "mLadyBird_2", ladybird *, this->mLadyBird_2);

最後に、次のようにmLadyBird_1およびmLadyBird_2でメソッドsetNumber()を呼び出してみてください。

mLadyBird_1->setNumber(1);
mLadyBird_2->setNumber(2);

EXC_BAD_ACCESSをオンにしました

mDotSprite_1->setVisible(false);

明らかに、私のシナリオは私のコードに実装されていませんでした。だから誰かがこれを行う正しい方法について私に教えてもらえますか?

ありがとうございました。

4

1 に答える 1

2

CCSpriteを介してロードするのと同じ問題があります

CCB_MEMBERVARIABLEASSIGNER_GLUE

大きい。

私はそれを使用して解決しました

CCB_MEMBERVARIABLEASSIGNER_GLUE_WEAK

大きい。

お役に立てば幸いです。

編集

ただし、より良い解決策を使用することです

CCB_MEMBERVARIABLEASSIGNER_GLUE

変数をNULLに初期化します

variableName = NULL;

デストラクタにゆっくりと放します

CC_SAFE_RELEASE(variableName);
于 2013-06-21T06:15:52.157 に答える