Как получить доступ к переменным в файле 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 как суб файл ccb.

После этого определения, я теперь предполагаю, что есть два Friend.ccb в FriendList.ccb, названный m_friend1 а также m_friend2, И в Friend.ccb Eсть 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?

0

Решение

При использовании файла 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’ этим экземплярам.

Итак, что заставило меня потерпеть неудачу раньше, так это на самом деле, я выбираю ‘владельца var’ из всех переменных в обоих FriendList.ccb а также Friend.ccb.

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]