首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在cocos2d-x中以自定义类作为根节点访问子ccb文件中的变量。

如何在cocos2d-x中以自定义类作为根节点访问子ccb文件中的变量。
EN

Stack Overflow用户
提问于 2013-04-28 18:05:39
回答 1查看 1.1K关注 0票数 0

假设我有两个建行档案

  • FriendList.ccb
  • Friend.ccb

FriendList.ccb与一个名为FriendList的类相关联,它将使用如下代码从这个ccb文件中读取节点:

代码语言:javascript
复制
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的两个实例

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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文件中的变量呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-28 18:05:39

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

让我们把它命名为FriendLoader,这是FriendLoader.h中的代码

代码语言:javascript
复制
#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()中注册

代码语言:javascript
复制
CCNodeLoaderLibrary * ccNodeLoaderLibrary = CCNodeLoaderLibrary::sharedCCNodeLoaderLibrary();
ccNodeLoaderLibrary->registerCCNodeLoader("Friend", FriendLoader::loader());

或者其他你喜欢的地方。

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

然后选择名为CCLabelTTFm_friend_name,并选择'Doc‘,这是非常重要的!!

这里我想简单地解释一下。

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

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

因此,让我失败的是,实际上,我选择了FriendList.ccbFriend.ccb中所有变量的'owner‘。

然后CCBReader将子Friend.ccb中的变量m_friend_name分配给'owner'( Friend的一个实例)。

有关更多信息,请参见CocosBuilder:与cocos2d-x连接

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16265996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档