天天看點

Cocos2d-x CocosBuilder使用教程(二)連接配接自定義類

本教程基于Cocos2d-x 2.0.4版本

看來2013年2月最多隻能寫三篇技術部落格了!今天學習使用了一下CocosBuilder的連接配接到自定義類的功能,确實很爽,讓IOS的程式員們不必再寫死了。通過看Cocosbuilder本身的document,以及搜尋網上資料,加上自己檢視CCB源碼,完成連接配接自定義類的功能。首先需要注意一點,CocosBuilder的Document是針對Cocos2d-iPhone的而不是Cocos2d-x的,是以很多Document裡面講到的并不适用于Cocos2d-x。因為cocos2d-x是基于C++的,是以無法通過類名字元串來動态建立類(OC當然可以了),這也是為什麼Cocos2d-x版本的CCB SDK在架構上添加CCNodeLoadLibrary的原因。

下面我将一步一步操作,并講解其中原理,讓你不但學會怎麼做,而且還知其原理。

使用CocosBuilder 2.1版本建立一個Project,叫做“ConnectToCustomClass”(引号當然不算名稱了,:p)。

建立一個檔案,派生自CCLayer,并選擇你想要的裝置類型,我選擇ipad landscape 1024 * 768,儲存為“ConnectToCustomClass”(與項目工程一緻)。

添加一個CCMenu節點到根節點(即CCLayer節點)。

添加一個CCMenuImage節點到CCMenu節點。

選中此節點,到CocosBuilder右側的CCMenuItemImage段中,點選Normal和Selected字段,選擇對應圖檔(Disable不用的話可以不選擇)。讀者可以下載下傳下列資源:

Normal:

Cocos2d-x CocosBuilder使用教程(二)連接配接自定義類

Selected:

Cocos2d-x CocosBuilder使用教程(二)連接配接自定義類

添加一個CCControlButton到根節點(即CCLayer節點)。

選擇此節點,到CocosBuilder右側的CCControlButton段更改“Font Size”字段為15。這裡使用CCControlButton也是為了讓讀者知道CocosBuilder中能處理按鍵消息的節點除了CCMenuItemImage以外,還有CControlButton。

添加一個CCLabelTTF到根節點(即CCLayer節點)。

選擇此節點,到CocosBuilder右側的CCLabelTTF段更改“Font Size”字段為15。這裡使用CCLabelTTF主要是教授如何在自定義的Layer類中聲明一個CCLabelTTF*變量指向CocosBuilder界面中的CCLabelTTF節點。

界面布局如圖。

Cocos2d-x CocosBuilder使用教程(二)連接配接自定義類

界面的“皮”做完了,但界面的神經還沒有接好。現在我們開始連接配接好界面的各個神經。

點選根節點(即CCLayer節點),在CocosBuilder右側我們可以看到Code Connections段。我們将"XJLayer"填入其中的“Custom class”字段中。

XJ是本人名稱縮寫,你可以寫成自己的名稱縮寫(但後續操作中XJ要替換成你的名稱字首了)。此操作的含義:讓CocosBuilder在儲存此節點時,将其節點标簽儲存為“XJLayer”,這樣在檔案解析的時候,當我們碰到節點标簽是"XJLayer"時,我們就知道這是我們自定義的XJLayer節點,我們需要對這個節點做特殊處理。

點選”切換賬号“節點(CCMenuItemImage節點),在CocosBuilder右側CCMenuItem段中,将”menuSelectorChangeAccount"填入“Selector“字段。在”Target“字段中選擇”Document root“。如下圖:

Cocos2d-x CocosBuilder使用教程(二)連接配接自定義類

看到這個,如果你編寫過Cocos2d-x的CCMenuItem相關的代碼,你應該很熟悉,這裡的”Target“字段就是指的希望處理該消息事件的對象,這裡是Document root,就是指的根節點,即我們的CCLayer節點(此節點Custom Class字段已經被我們改成”XJLayer“)。”Selector“字段就是處理消息事件的函數名稱。

點選”Title“節點(CCControlButton節點),在CocosBuilder右側CCControl段中,我們将”controlButtonTest“填入”Selector“字段,在”Target“字段中選擇”Document root“。

兩個字段含義想必你能猜到。這裡值得注意的是下面的9個複選框,這裡預設選中”Up inside“。這些複選框表示你感興趣的消息。目前你隻對按鍵在button中擡起事件感興趣。即:當使用者點選此按鈕擡起時,你的”controlButtonTest“函數會被調用(controlButtonTes函數在哪呢,後面會提到)。

點選”Sample Test“節點,在CocosBuilder右側"Code Connections"字段,更改”Don't assign“字段為”Doc root var“字段,并将"m_TestLabel"填入該字段。

這裡是說,這個對象會被指派給”文檔根變量“,也就是根節點對象。賦給該對象的”m_TestLabel“成員變量。這裡就是教授如何把CocosBuilder檔案裡的對象指派給自定義類的某個成員變量,建立起Cocos2d-x和CocosBuilder的聯系。

儲存檔案(【Command】+【s】,一定要儲存檔案哦,沒有點選儲存檔案,更改不會被記錄),然後釋出(【Command】+【Option】+【S】)。

建立一個Cocos2d-x模版工程,起名叫做”ConnectToCustomLayer“。

從CocosBuilder建立的Project路徑裡面,将ccbResources檔案夾(CCControlButton預設背景圖檔是在ccbResources檔案夾下的),以及兩張我提供的圖檔資源和一個”ConnectToCustomClass.ccbi“檔案(不是ccb檔案哦)拷貝到Cocos2d-x項目工程resources檔案夾下,并全部添加到xCode項目的Resources下(注意,一定要添加到項目工程,這樣加載ccbi檔案時,CCB SDK才能找到ccbi檔案。在添加的時候填出的提示框中,一定要選中對應目标項目即Target)。

Cocos2d-x CocosBuilder使用教程(二)連接配接自定義類

在項目檔案視圖中,點選Classes,建立一個C++類【Command】+【N】。其名稱叫做”XJLayer"。代碼人如下:

代碼是重點。

1.這裡XJLayer除了繼承自CCLayer,也繼承自兩個你很陌生的類(CCBSelectorResolver,CCBMemberVariableAssigner)。通過字面意思,我們大體能知道,兩個類分别是:selector解析器,和成員變量指派器。這是兩個抽象類,在java也稱為接口。即繼承自這兩個類的類,必須重寫其純虛函數。

CCBSelectorResolver有兩個:

CCBMemberVariableAssigner有一個:

CCBSelectorResolver中分别解析MenuItem的消息處理函數和CControlButton的消息處理函數。

CCBMemberVariableAssigner就是連接配接ccbi檔案建立的對象與cocos2d-x對象的。

另外:一定要施放與CocosBuilder綁定的對象。CC_SAFE_RELEASE_NULL( m_TestLabel );

2.我們建立了一個XJLayerLoader,其繼承自CCLayerLoader(CCLayerLoader是CCBReader中的一個類,此類負責CCLayer節點的加載)。通過派生,我們讓這個加載器建立我們自己的類對象,也就是通過這個宏定義完成的——CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD( XJLayer );ccbi檔案解析時,建立節點就是通過createCCNode完成的。我們會聲明一個XJLayerLoader對象,傳給ccbi閱讀器,閱讀器在特定時候調用該加載器的createCCNode()來建立我們自己的Layer。

這裡是兩個消息處理函數,輸出一些調試資訊,以讓我們知道按鈕被點選了。另外三個函數,就是上面提到的三個虛函數,分别解決MenuItem消息處理函數歸屬(即那個函數作為消息處理函數),CControlButton消息處理函數歸屬,以及變量複制的。也分别對應三個宏,讀者可以自己去看宏定義函數。

打開AppDelegate.cpp檔案,做如下修改:

cocs-ext.h包含了讀取ccbi所需類的所有頭檔案。

修改AppDelegate::applicationDidFinishLaunching()

CCNodeLoaderLibrary類内包含了所有節點的加載器。CCBReader類将使用這個庫内的對應加載器去建立對應的節點。因為我們要建立我們自定義的節點,是以我們往庫内注冊了一個新節點加載器。

即當遇到節點類型(或稱為标簽)為“XJLayer“的時候,使用XJLayerLoader::loader()建立出來的那個加載器來建立節點。而我們知道這個加載器重寫createCCNode,這樣就能正确建立出我們自定義的XJLayer了。

另外當CCBReader遇到某些節點中有selector,target屬性時,就會找到根節點(根節點就是我們的XJLayer節點,我們的加載器此時已經建立了一個XJLayer對象),然後調用對應的虛函數,去解決消息處理函數歸屬和變量複制的問題。這樣就完成ccbi對象與cocos2d-x對象的連接配接。

運作程式,【Command】+【R】。如果順利的話,你将得到如下運作效果:

Cocos2d-x CocosBuilder使用教程(二)連接配接自定義類

點選左側兩個按鈕,xCode調試輸出視窗内會有我們事先寫入的調試資訊輸出。斷點調試,你會發現XJLayer類對象的m_TestLabel是有值的。這就證明m_TestLabel正确連接配接了”Sample Test“标簽。

寫了快2個小時了好像,終于搞定,希望大家多交流,促進行業發展。

繼續閱讀