本文仅供个人记录和复习,不用于其他用途
菜单的作用
不管是开始界面还是游戏设置界面以及等等,都需要设计菜单。菜单可不仅仅就是一张图片,我们点击了按键之后还必须有一定的反应,比如跳转到某个界面等等。
3.x版本改变
- 取消了
menu_selector,采用新的回调函数 - 各项类的创建方法有所改变,请自行查阅源代码
CCMenu
菜单CCMenu是一个CCLayer,但是子节点只能够存放CCMenuItem以及其子类。换句话说,CCMenu是用来存放菜单按钮的。我们一般先创建CCMenuItem,全部设置好了之后,统一加入到CCMenu,最后将CCMenu加入到当前图层中。
CCMenuItem可以直接加入层中,但是没有办法响应回调事件,因为CCMenu继承自CCLayer,而CCMenuItem继承自CCNode。注意以下几点:
CCMenu的锚点为(0, 0),默认原点坐标为屏幕中央CCMenuItem的锚点为(0.5, 0.5),默认原点坐标为(0, 0)
由于CCMenuItem的坐标是相对于CCMenu而言的,因此,CCMenuItem看起来是位于图层中心,实际上位于CCMenu的左下角。所以为了方便,我们一般将CCMenu的位置设置为(0, 0),让它与当前图层重合,方便调整CCMenuItem的位置。
|
|
CCMenu的初始化需要我们传入所有CCMenuItem,并且以NULL结尾来表示参数列表结束。这里的create()使用的是可变参数列表。
部分重要方法如下:
|
|
比较有用的是调整菜单按钮的排列方式,其他的用的不多。
CCMenuItem
CCMenuItem是菜单项的父类,一般不直接使用,因为无法显示字体之类的内容。至于功能以下几个:
- 三个按钮状态:正常、选中、禁用
- 点击按钮之后,会自动执行回调函数
- 点击按钮后会放大
菜单项可以分为三个类别:
- 文字菜单项:
CCMenuItemLabel、CCMenuItemAtlasFont、CCMenuItemFont - 图片菜单项:
CCMenuItemSprite、CCMenuItemImage - 切换菜单项:
CCMenuItemToggle
下面我们将一一介绍。
CCMenuItemLabel
看到名字我们就可以知道,CCMenuItemLabel可以存放文字标签:
|
|
CCMenuItemAtlasFont
这个是CCMenuItemLabel的子类,使用CCLabelAtlas来创建文字标签的菜单项按钮,需要提供显示的字符串内容以及.png文件:
|
|
CCMenuItemFont
这个同样也是CCMenuItemLabel的子类,使用CCLabelTTF创建菜单项,可以直接设置字符串内容,无需提供字体文件:
|
|
CCMenuItemSprite
顾名思义,这是一个由精灵组成的菜单按钮,内部有三个精灵,分别为正常、选中、禁用,所以我们可以根据三种状态设置不同的图案:
|
|
CCMenuItemImage
这个继承自CCMenuItemSprite,我们无需创建精灵便可以直接创建菜单项:
|
|
CCMenuItemToggle
此类是一个菜单项按钮对象的集合,能够包含很多的菜单项按钮状态,方便开发者进行切换:
|
|
代码实现
类的实现有些枯燥,我们来实际的创建一个菜单:
|
|
这是一个很简单的菜单,我们只加入了一个菜单项,同时也没有对回调函数编写其他的功能。不出意外的话,你可以看到屏幕中间出现fontmenu的字样。但是呢,它的结构其实是这样的:
CCMenu的锚点为(0, 0),坐标为层的中央。CCMenuItem的锚点为(0.5, 0.5),坐标为(0, 0)。所以呢,我们就能看到现在的结构。不过为了方便调整菜单项的位置,我们一般将菜单的位置调整为(0, 0),让它与层重合。
|
|
我们可以调用一下子方法,就会发现CCMenu和CCLayer是一样大的。
|
|
我们再加入一个菜单项,会发现两个菜单项的位置重叠在了一起,这时候怎么办呢?
|
|
不用手动去调整位置,这样就可以让菜单项上下排列好。
|
|
我们还可以改变一下菜单项的上下间隔。