Как получить доступ к переменным в файле sub-ccb с пользовательским классом в качестве корневого узла в cocos2d-x

Допустим, у меня есть два файла 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, Он также может содержать свои собственные переменные, такие как CCLabelTTF, CCSprit,

И в FriendList.ccb, он может содержать много Friend.ccb как файл sub ccb.

После их определения я теперь предполагаю, что в FriendList.ccb есть два файла Friend.ccb с именем m_friend1 а также m_friend2, а в Friend.ccb есть CCLabelTTF название m_friend_name,

Я загружаю два экземпляра Friend со следующим кодом в FriendList.cpp:

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:

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?

1 ответ

Решение

При использовании файла sub 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());

или другое место, которое вам нравится.

Тогда мы можем использовать пользовательский класс (Friend) в файле ccb. Откройте файл Friend.ccb, выберите корневой узел и заполните поле "Пользовательский класс" с помощью Friend,

Затем выберите CCLabelTTF названный m_friend_name и выберите "Doc root var", это очень важно! ! !,

Здесь я хочу дать простое объяснение.

Так как в FriendList класс, он читает узел из файла ccb с reader.readNodeGraphFromFile("FriendList.ccbi", this); и использует себя как "владельца", поэтому эти переменные в нем являются "владельцем var". При чтении узлов, CCBReader назначит эти 'владельца var' этому 'владельцу', который является FriendList экземпляр напрямую.

В то время как Friend это пользовательский класс, используемый в CocosBuilder, это корневой узел в Friend.ccb, и переменная в нем - 'Doc root var'. При чтении узлов, CCBReader сначала будет читать примеры Friend, затем присвойте эти 'Doc root var' этим экземплярам.

Так что прежде я потерпел неудачу, так это то, что я выбрал 'owner var' из всех переменных в FriendList.ccb и Friend.ccb.

затем CCBReader назначить переменную m_friend_name в sub Friend.ccb для "владельца" (экземпляр Friend).

Для получения дополнительной информации см. CocosBuilder: Соединение с cocos2d-x.

Другие вопросы по тегам