0

假设我有两个 ccb 文件

  • 好友列表.ccb
  • 朋友.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. 它还可以包含自己的变量,例如CCLabelTTF, CCSprit

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

在这些定义之后,我现在假设 FriendList.ccb中有两个Friend.ccb,分别命名为and ,并且在Friend.ccb有一个name 。m_friend1m_friend2CCLabelTTFm_friend_name

我在FriendList.cppFriend中使用以下代码加载了两个实例:

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.cppCCLabelTTF中使用以下代码加载 的实例:

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.

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

4

1 回答 1

1

当使用与自定义类关联的子 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());

或者你喜欢的其他地方。

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

然后选择CCLabelTTFnamed m_friend_name,然后选择'Doc root var',这个很重要!!!.

在这里,我想做一个简单的解释。

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

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

所以之前让我失败的确实是这些,我选择了 FriendList.ccb 和 Friend.ccb 中所有变量的' owner var '

然后将sub Friend.ccbCCBReader中的变量分配给“所有者”(的实例)。m_friend_nameFriend

更多信息,可以查看CocosBuilder:使用 cocos2d-x 连接

于 2013-04-28T18:05:39.503 回答