访问子ccb文件cocos2d-x中的变量

时间:2013-02-08 00:22:45

标签: cocos2d-x

如何从主“ccb”文件(cocos2d-x)的自定义图层类访问sub-ccb中定义的成员变量?

以下是此问题的基本情景,


我有一个名为“ladybirds_page.ccb”的CCB文件,并将自定义加载器类关联如下(root是CCLayer)

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

我有另一个名为“ladybird.ccb”的CCB文件并将自定义加载器类关联如下(root是CCNode)

  • ladybirdLoader.h
  • ladybird.h
  • ladybird.cpp

“ladybirds_page.ccb”文件包含几个“ladybird.ccb”实例。它们与相关成员变量相关联(mLadyBird_1,mLadyBird_2,..)

和“ladybird.ccb”它包含几个与成员变量相关的CCSprites(mDotSprite_1,mDotSprite_2,...)

我希望为每个实例获取这些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);

显然,我的方案没有在我的代码中实现。所以有人可以告诉我这样做的正确方法吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

我在通过

加载CCSprite时遇到同样的问题
CCB_MEMBERVARIABLEASSIGNER_GLUE

宏。

我用

解决了它
CCB_MEMBERVARIABLEASSIGNER_GLUE_WEAK

宏。

希望有所帮助。

编辑

然而,使用更好的解决方案

CCB_MEMBERVARIABLEASSIGNER_GLUE

并将变量初始化为NULL

variableName = NULL;

轻轻释放到析构函数

CC_SAFE_RELEASE(variableName);