0、
相信很多使用Cocos2d系列引擎的開發者,都被制作UI、貼坐標這件事折磨得苦不堪言。現在Cocos2d系引擎都還很年輕,可視化的編輯工具並不完善,主流的界面編輯器有CocosBuilder以及觸控的CocosStudio等。但實際上,這兩者都還沒被廣泛用在實際的開發中。其中CocosBuilder被認為最大的雞肋在於控件的可擴展性上。但其實,作為開源項目,CocosBuilder提供了足夠的手段讓我們擴展它。接下來通過這個教程,將告訴大家如何擴展CocosBuilder。
1、
本文適用與符合以下幾點的讀者:
@Require
a. 使用Mac平台+XCode開發;
b. 熟悉Objective-C。
c. 熟悉Cocos2d-iPhone或Cocos2d-x;
d. 熟悉CocosBuilder。
本文包含以下內容:
a. 使用CocosBuilder的CCRotatingSprite控件擴展CocosBuilder;
b. 擴展引擎控件CCMenuItemToggle;
c. 詳解CCBPProperties.plist文件。
2、
在GitHub(https://github.com/cocos2d/CocosBuilder)上下載最新版本的CocosBuilder源碼,然后打開並編譯的CocosBuilder/PlugIn Nodes/CCRotatingSprite工程,得到CCRotatingSprite.ccbPlugNode。將CCRotatingSprite.ccbPlugNode復制到CocosBuilder.app/Contents/PlugIns目錄下,並重新打開CocosBuilder,在標題欄右邊,就可以往項目里添加這個控件了。
CCRotatingSprite是一個在不斷旋轉的Sprite。添加完控件后,還可以看到CocosBuilder很人性化地在編輯器內也運行了旋轉的動畫。
單擊節點樹中的CCRotatingSprite,我們還可以看到該類的所有可編輯屬性。其中包括了其父類CCNode和CCSprite的屬性,以及其自身的屬性Sec/rotation。這個屬性是CCRotatingSprite的轉動頻率,我們不妨把它改成0.1看看(鬼畜的)效果。
那么這個CCRotatingSprite是怎么制作的呢?接下來就是重點了。打開CCRotatingSprite.h文件,可以看到,在這里聲明了secondsPerRotation這個變量。
@property (nonatomic,assign) float secondsPerRotation;
在CCRotatingSprite.m中,重寫了setSecondsPerRotation方法。也就是說,每次通過self.secondsPerRotation,都會調用setSecondsPerRotation,開啟旋轉的動作。
- (void) setSecondsPerRotation:(float)spr { secondsPerRotation = spr; // Stop rotating [self stopAllActions]; // Rotate with the new speed [self runAction:[CCRepeatForever actionWithAction:[CCRotateBy actionWithDuration:spr angle:360]]]; }
這個就是CCRotatingSprite能在CocosBuilder中旋轉的秘密了。
接下來,通過CCBPProperties.plist文件,將這些屬性綁定到CocosBuilder中,讓它可以被編輯。
CCBPProperties.plist是CocosBuilder插件必備的一個配置文件,它有特定的屬性和格式供CocosBuilder識別。。現在只對用到屬性作簡單介紹,讀者如果不是很明白,沒有關系,在下一步自制控件中,我們將全面的介紹CCBPProperties.plist中的屬性,這里只要了解即可。
InheritsFrom是CCRotatingSprite的父類,毫無疑問,填上CCSprite。
canHaveChildren,如字面的意思,表示CCRotatingSprite類是否能擁有子類。
className是在你的工程中使用時對應的類名,editorClassName是在CocosBuilder中對應的類名。這兩者通常相同,但也有不同的情況。
properties是一份屬性列表。
第一個屬性是一個Separator類型,displayName是在CocosBuilder中顯示的名稱,name是在代碼中對應的名稱,dontSetInEditor即don’t set in editor。
第二個屬性會更容易理解一些。一個Float類型的值,在CocosBuilder中顯示的名稱(displayName)是Sec/rotation,對應到代碼中的名稱(name)是secondsPerRotation。我們在CCRotatingSprite.m的init方法中將其設置為2了,因此在CocosBuilder中出現的初始值也會是2。
這里特別注意的是,如果我們寫錯屬性、拼錯單詞等等問題,都可能導致屬性無法在CocosBuilder中顯示出來,而且不會有任何的錯誤輸出,還真是很不友好呢。
擺脫無盡的貼坐標,自制CocosBuilder插件(二) http://www.cnblogs.com/Ringo-D/archive/2013/05/21/3090949.html