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