如何使用自定义类作为cocos2d-x中的根节点访问sub-ccb文件中的变量

时间:2013-04-28 18:05:40

标签: c++ cocos2d-x cocosbuilder

假设我有两个ccb文件

  • FriendList.ccb
  • Friend.ccb

FriendList.ccb 与名为FriendList的类关联,它将使用以下代码从此ccb文件中读取节点:

CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary();
CCBReader reader = CCBReader(ccNodeLoaderLibrary);
CCLayer* layer = (CCLayer*)reader.readNodeGraphFromFile("FriendList.ccbi", this);

Friend.ccb 与自定义类名Friend和名为FriendLoader的自定义加载器相关联。它还可以包含自己的变量,例如CCLabelTTFCCSprit

FriendList.ccb 中,它可以包含许多 Friend.ccb 作为子ccb文件。

在这些定义之后,我现在假设 FriendList.ccb 中有两个 Friend.ccb ,名为m_friend1m_friend2,并且 Friend.ccb 有一个CCLabelTTF名称m_friend_name

我在 FriendList.cpp 中使用以下代码加载Friend的两个实例:

bool FriendList::onAssignCCBMemberVariable(CCObject *pTarget, CCString *pMemberVariableName, CCNode *pNode){
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "m_friend1", Friend*, m_friend1);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "m_friend2", Friend*, m_friend2);
    return false;
}

并使用 Friend.cpp 中的以下代码加载CCLabelTTF的实例:

bool Friend::onAssignCCBMemberVariable(CCObject *pTarget, CCString *pMemberVariableName, CCNode *pNode){
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "m_friend_name", CCLabelTTF*, m_friend_name);
    return false;
}

通过这些工作,我可以成功访问m_friend1m_friend2,但在访问m_friend1->m_friend_name时,我获得了EXC_BAD_ACCESS

那么如何访问sub ccb文件中的变量呢?

1 个答案:

答案 0 :(得分:1)

当使用与自定义clase关联的子ccb文件时,我们需要先添加自定义加载器。

我们将其命名为FriendLoader FriendLoader.h 中有代码:

#include "Friend.h"

/* Forward declaration. */
class CCBReader;
class FriendLoader : public cocos2d::extension::CCLayerLoader {
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(FriendLoader, loader);

protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(Friend);
};

并在AppDelegate::applicationDidFinishLaunching()注册:

CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary();
ccNodeLoaderLibrary->registerCCNodeLoader("Friend", FriendLoader::loader());

或其他你喜欢的地方。

然后我们可以在ccb文件中使用自定义类(Friend)。打开 Friend.ccb 文件,选择根节点,并使用Friend填写“自定义类”空白。

然后选择名为CCLabelTTF的{​​{1}},并选择'Doc root var',这是非常重要! ! !即可。

我想在这里给出一个简单的解释。

因为在m_friend_name类中,它使用FriendList从ccb文件读取节点,并将自身用作“所有者”,因此其中的这些变量是“所有者var”。在阅读节点时,reader.readNodeGraphFromFile("FriendList.ccbi", this);会将这些“所有者var”分配给此“所有者”,直接为CCBReader个实例。

虽然FriendList是CocosBuilder中使用的自定义类,但它是 Friend.ccb 中的根节点,其中的变量是“Doc root var”。在读取节点时,Friend将首先读取CCBReader的实例,然后将这些'Doc root var'分配给这些实例。

那么之前让我失败的是这些,我选择 FriendList.ccb Friend.ccb 中所有变量的'owner var'。

然后Friend将子 Friend.ccb 中的变量CCBReader分配给“所有者”(m_friend_name的实例)。

有关详细信息,请参阅CocosBuilder: Connecting with cocos2d-x