Допустим, у меня есть два файла 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?
При использовании файла 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.
Других решений пока нет …