假设我有两个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 ,名为m_friend1
和m_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_friend1
和m_friend2
,但在访问m_friend1->m_friend_name
时,我获得了EXC_BAD_ACCESS
。
那么如何访问sub ccb文件中的变量呢?
答案 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。