接上篇(http://www.cnblogs.com/Ringo-D/archive/2013/05/21/3090928.html)
3、
了解了CocosBuilder插件的效果,接下来就开始扩展了。笔者的项目中需要大量使用到Cocos2d自带的CCMenuItemToggle控件。为了更快的创建新的插件,我们选择从原有插件上进行修改。CCMenuItemToggle的代码,https://github.com/RingoD/CCMenuItemToggle
首先复制CCRotatingSprite,创建CCRotatingSprite的一个副本,并将副本重命名为CCMenuItemToggle。
然后打开项目,通过XCode修改项目名称为CCMenuItemToggle 。
理论上,CCMenuItemToggle是Cocos2d自带的类,因此我们不需要额外写实现文件。但是实际上,CCMenuItemToggle的实现方式并不适合在CocosBuilder中编辑,或者应该说,CocosBuilder不支持CCMenuItemToggle的编辑方式。这是什么意思?我们先来看Cocos2d中CCMenuItemToggle的实现方式。
-(id) initWithItems:(NSArray*)arrayOfItems block:(void(^)(id sender))block
{
if( (self=[super initWithBlock:block] ) ) {
self.subItems = [NSMutableArray arrayWithArray:arrayOfItems];
_currentItem = nil;
_selectedIndex = NSUIntegerMax;
[self setSelectedIndex:0];
self.cascadeColorEnabled = YES;
self.cascadeOpacityEnabled = YES;
}
return self;
}
-(void)setSelectedIndex:(NSUInteger)index
{
if( index != _selectedIndex ) {
_selectedIndex=index;
if( _currentItem )
[_currentItem removeFromParentAndCleanup:NO];
CCMenuItem *item = [_subItems objectAtIndex:_selectedIndex];
[self addChild:item z:0];
self.currentItem = item;
CGSize s = [item contentSize];
[self setContentSize: s];
item.position = ccp( s.width/2, s.height/2 );
}
}
可以看出,它是通过在将所有需要的CCMenuItem保存在subItems的NSMutableArray中,然后每次设置了index之后,都从subItems取出一项,并addChild到界面上。
然而,在CocosBuilder的编辑栏中,并没有可视化地编辑数组的方式,因此,我们需要重新实现CCMenuItemToggle,将其改变为类似于CCMenu那样,将每一个addChild到上面的CCMenuItem,都添加到数组中,并通过setVisible来设置不同的index。
这里我们通过ObjC强大的类别(Category)功能来实现就可以了。首先将CCRotatingSprite.h/.m从项目中删除,并新建CCMenuItemToggle类。重新实现的方法并没有什么难点,这里我就直接贴代码了。
@implementation CCMenuItemToggle(CocosBuilder)
-(NSMutableArray*)subItems
{
if (_subItems==nil) {
_subItems = [[NSMutableArray alloc] init];
}
return _subItems;
}
-(void)addChild:(CCNode *)node z:(NSInteger)z tag:(NSInteger)aTag
{
if (![node isKindOfClass:[CCMenuItem class]]) {
CCLOG(@"The Child Of CCBMenuItemToggle Must Be The Subclass of CCMenuItem ! ");
return;
}
[super addChild:node z:z tag:aTag];
node.visible = NO;
[self.subItems addObject:node];
NSUInteger currentIndex = self.selectedIndex;
_selectedIndex = NSUIntegerMax;
self.selectedIndex = currentIndex;
}
-(void)setSelectedIndex:(NSUInteger)index
{
if( index != _selectedIndex && index<_subItems.count ) {
if( _currentItem ){
_currentItem.visible = NO;
}
CCMenuItem *item = [_subItems objectAtIndex:index];
CGSize s = [item contentSize];
[self setContentSize: s];
item.position = ccp( s.width/2, s.height/2 );
item.visible = YES;
_currentItem = item;
_selectedIndex=index;
}
}
接下来要做的就是重中之重了-修改CCBPProperties.plist文件。
为了便于读者阅读以及事后查询,这里把CCBPProperties.plist的全部属性的介绍,都移到了另一篇文章(http://www.cnblogs.com/Ringo-D/archive/2013/05/21/3090951.html)。
了解了CCBPProperties.plist的全部属性后,CCMenuItemToggle的编辑也就不难了,完整版的内容如下:
然后编译生成CCMenuItemToggle.ccbPlugNode,并将其复制到CocosBuilder.app/Contents/PlugIns目录下。
最后的最后,别忘了修改CocosBuilder.app/Contents/PlugIns/CCMenu.ccbPlugNode/Contents/Resources/CCBPProperties.plist,在requireChildClass下添加CCMenuItemToggle。
这样,我们就可以在CocosBuilder中编辑CCMenuItemToggle了。
编辑完成后,别忘了在将CCMenuItemToggle.h/.m添加到你的项目中,否则可是会出错的噢。
4、
通过教程,大家可以看到,CocosBuilder的扩展性还是比较强的,虽然插件的过程制作比较繁琐,但这是个一劳永逸的事情。可视化的编辑可以很大程度的提高工作效率,而且也更容易进行工作交接(偷懒必备)。大家如果有制作好的插件,也欢迎上传到GitHub共享。不过在此还是强烈呼吁CocosBuilder团队原生支持更多的基础控件。
最后,还留下来了两个问题,
1、每次更新控件都要重新生成并移动插件到CocosBuilder下,而且工程中的控件和CocosBuilder的插件都应该共享同一份代码,如果手动调整就太麻烦了。理论上这里可以通过配置XCode工程来实现,但我还没试过。有兴趣的同学可以配置一下。
2、本文针对的都是Cocos2D-iPhone,Cocos2D-X(C++)应该也是可以的,具体怎么实现,有空再试一下~
原文链接: https://www.cnblogs.com/Ringo-D/archive/2013/05/21/3090949.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/89401
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!