摆脱无尽的贴坐标,自制CocosBuilder插件(二)

接上篇(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。

摆脱无尽的贴坐标,自制CocosBuilder插件(二)

然后打开项目,通过XCode修改项目名称为CCMenuItemToggle 。

摆脱无尽的贴坐标,自制CocosBuilder插件(二)

理论上,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的编辑也就不难了,完整版的内容如下:

摆脱无尽的贴坐标,自制CocosBuilder插件(二)

然后编译生成CCMenuItemToggle.ccbPlugNode,并将其复制到CocosBuilder.app/Contents/PlugIns目录下。

最后的最后,别忘了修改CocosBuilder.app/Contents/PlugIns/CCMenu.ccbPlugNode/Contents/Resources/CCBPProperties.plist,在requireChildClass下添加CCMenuItemToggle。

这样,我们就可以在CocosBuilder中编辑CCMenuItemToggle了。

摆脱无尽的贴坐标,自制CocosBuilder插件(二)摆脱无尽的贴坐标,自制CocosBuilder插件(二)

编辑完成后,别忘了在将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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午12:08
下一篇 2023年2月10日 上午12:08

相关推荐