X

cocos2dx之Scroll Menu制作

可能cocos2dx一开始是做手机小游戏的,所以有些设计思想跟其他项目(比如flash,pc等)不太一样。我夲是一直做flash的,刚接触cocos2dx的时候就对它的坐标系统很不习惯,现在慢慢习惯了,不过写代码的时候还是得时常留意着。要说cocos2dx设计的怪异(或许是我的问题)的地方很多,这篇先记录下今天在CCMenu上碰到的一个大坑。

遇坑过程

CCMenu已经在很多地方使用过了,使用过程还算顺利。我们使用CCMenu有2种形式。

  1. CCMenu在CCBI里做:做界面的同学在CCBI里画好CCMenu,我只需要加载CCBI,并且注入一个回调函数,所有事情都在回调函数里做,不修改CCMenu。
  2. CCMenu做为ScrollView里的容器,代码创建CCMenu,并在创建ScrollView的时候将CCMenu作为参数传递过去。

本来这两种形式都用的好好的,没有出现问题,今天要在ScrollView里的CCMenu选中的菜单上表现为选中状态,美术为了省事,给了一个选择框(SelectedBox)来表示选中状态。

问题1:CCScrollView只允许一个Child

毫无疑问是用ScrollView包含CCMenu和SelectedBox,几个CCMenuItem放到CCMenu中。代码写好测试时有报错说addChild到CCMenu的对象必须是CCMenuItem及其子类,当前是SelectedBox,于是查看CCScrollView::addChild的源码,发现CCScrollView只允许有一个child(m_pContainer),其他对象都会自动addChild到m_pContainer中去。OK,那么就将CCMenu和SelectedBox放到一个CCNode中,而将这个CCNode放到CCScrollView中,这样就解决了SelectedBox自动被addChild到CCMenu中的问题了。

问题2:CCMenu默认坐标为屏幕中心

以为这样就可以完美解决问题了吗,那是想的太简单了。测试后发现菜单项竟然没有显示,很少奇怪,于是先将CCScrollView去掉,直接将菜单显示出来看看,原来菜单显示的位置偏掉了,像右上角偏移了很多。一开始是以为是CCNode的默认坐标或者锚点有问题,手动设置后没有效果,然后又在CCNode中添加一个CCSprite作为参照(SelectedBox没有让显示),发现是CCMenu本身的位置有问题,于是看了CCMenu的源代码,很是坑爹,竟然在设置了默认坐标为屏幕中心,手动设置为(0,0)便正常了。

至于CCMenu设置默认坐标为屏幕中心,猜想可能是因为cocos2dx一开始是为了给手机小游戏而设计的,很多手机小游的第一个可交互页面为菜单页,包含(开始菜单设置菜单,等),这些都是居中显示,如果CCMenu默认坐标为屏幕中心,那么也就不需要再手动设置坐标了。而且CCMenu的对其也是根据这样的思想来设计的。

最终效果

这是最终的效果图。

This post was last modified on 2019 年 02 月 28 日 01:23

This website uses cookies.