2013-04-28 47 views
0

比方說,我有兩個建行的文件如何使用自定義的類訪問變量子CCB文件作爲根節點在cocos2d-x

  • FriendList.ccb
  • Friend.ccb

FriendList.ccb助理和一個叫FriendList類,它會讀取該文件,建行與節點像下面的代碼:

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如子建行的文件。

這些後確定,我現在假設有兩個Friend.ccbFriendList.ccb,命名爲m_friend1m_friend2,並在Friend.ccb有一個CCLabelTTFm_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_friend1m_friend2,但訪問m_friend1->m_friend_name,我得到了EXC_BAD_ACCESS

那麼如何訪問sub ccb文件中的變量?

回答

1

當使用與自定義clase關聯的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()); 

,或者您喜歡的其他一些地方。

然後我們可以在ccb文件中使用自定義類(Friend)。打開Friend.ccb文件,選擇根節點,並用Friend填寫'Custom class'空白。

然後選擇名稱爲m_friend_nameCCLabelTTF,並選擇'Doc root var',這是非常重要的! ! !

這裏我想給一個簡單的解釋。

由於在FriendList類中,它從ccb文件中讀取節點reader.readNodeGraphFromFile("FriendList.ccbi", this);,並將其本身用作「所有者」,因此它們中的這些變量都是「owner var」。當讀取節點時,CCBReader將直接將這些'owner var'分配給這個'owner',它是一個FriendList實例。

雖然Friend是在CocosBuilder中使用的自定義類,它是在Friend.ccb根節點,和在它的變量是「文檔根變種」。當讀取節點時,CCBReader將首先讀取Friend的實例,然後將這些'Doc root var'分配給這些實例。

那麼是什麼讓我失敗面前的確是這些,我選擇在這兩個FriendList.ccbFriend.ccb所有變量的「所有者變種」。

然後CCBReader在子Friend.ccb分配變量m_friend_name的 '所有者'(的Friend一個實例)。

欲瞭解更多信息,可以看到CocosBuilder: Connecting with cocos2d-x

相關問題