cocos2dx原生的menu排版函数实现的很无完整,像最基本的Item的排序要想做得稍微漂亮一些就需要我们自己实现。
对于Menu我们可以用两种方法来实现:
1.大神级别。 继承自Control,自己来封装新的Menu类,要求我们能够友好的去抽象定义基类。
2.半仙级别。修改MenuItem的函数或者重写一套对于Item的排序函数。做到自己想要的排版。
3.菜鸟级别。继承自Node,在Node中添加成员变量Menu,针对不同的UI设置Item的位置和动画。
这里解析一下第三种方法,第一种方法确实是最好的,做到基类重用,但是一些动态的效果跟3一样写,没有一个好的架构就还是老老实实用3吧。
保卫萝卜的菜单分为建塔菜单和升级塔的菜单。比较难的是建造塔的菜单,这个菜单的实现有几个技术难点:
1.根据当前关卡的塔来创建item
2.塔如果超过4种要分两行
3.Menu要根据屏幕位置动态适应position
4.show和hide菜单的时候要实现动画,Item都是放大和缩小后才隐藏的。
(进入关卡前资源一定要实现动态异步加载,只加载本关所需要的素材,还有各种文件的异步加载,具体的参考我的上一篇博客)
先看下效果图吧:
这篇blog我不会贴代码了,只讲解一下框架逻辑。
首先定义一个类继承自MenuItem,简单封装一下Menuitem,让我们后面可以判断点击到的item是哪一种塔,因为我们要展示item是否为可点击状态。 如果金币不够的话是不允许建造塔的。
然后创建一个Node。
createMenuItem的时候是根据当前关卡的配置信息来创建的,创建所有Item到成员变量
cocos2d::Vector<cocos2d::MenuItem*> menuItems;中,以便我们后期执行Item动画。
如果超过4种塔,我们就再添加一个Menu,在Node中添加两个Menu来控制排版。
定义成员函数void updateItemsPosition(int row, int col),根据当前点击砖块的位置,在Node中动态设置Menu的位置。
最后就是第四步了,实现show和hide动画。
这样就很简单了,只需动画执行完隐藏就好,如下:
void *****::hide() { if (!m_pRangeSprite->isVisible()) { return; } ScaleTo *scaleTo = ScaleTo::create(CW_UPTOWERMENU_ANIM_DURATION, 0.0f); auto callc = CallFunc::create(CC_CALLBACK_0(UpTowerMenu::hideMe, this)); m_pRangeSprite->runAction(CCSequence::create(scaleTo, callc, NULL)); }
到这里就可以做出完全一样的菜单了,这是一种比较简单的方法,类似的升级菜单也是如此。
吐槽一下:
今天TX电话面试了,面试的时候各种抓瞎。
问我多线程渲染啊,函数式编程啊,还有怎么省电。。
当时被问的我就说不会了,没看过源码,不理解底层。。。
下来一看神马多线程渲染,就是异步加载,底层一个队列来异步加载资源的,源码也看过了。。。我以为是opengl绘图性能多线程。。屏幕分块渲染呢,完蛋了。
还有函数式编程,我说不会没听过。。。尼玛原来是闭包,lambda函数,lua元表,IOSblock。。。。我竟然说不会!!!
省电这个就确实不太理解了,可能也是概念上的问题吧,不知道咋整了,这一面感觉好蛋疼。。。求过了!!!!
Menu的自定义实现-------保卫萝卜造塔升级塔菜单实现,布布扣,bubuko.com