本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010   

一、菜单项(CCMenuItem

菜单项CCMenuItem是一个基类,它的子类可以加入CCMenu中形成菜单。CCMenu类的继承关系如下图所示。

CCMenuItem类是所有按钮的基类。建议大家不要直接使用该类,因为它并不包含具体显示的功能。其作为所有

按钮对象的父类,主要提供了下面的两个功能。

<1> 提供了基本按钮的状态:正常、选中和无效。

<2> 为按钮对象实现了基本的回调函数机制。当按钮对象被玩家点击按下后,通常需要执行一个动作,比如进入游戏

或者打开子菜单。此时会调用一个函数来执行游戏内的逻辑,这个函数就是按钮对象的回调函数。我们要通过编码来

实现回调函数的内容。

二、标签菜单项

1、使用字体定义的菜单项,包括CCMenuItemAtlasFont和CCMenuItemFont两种定义菜单项字体的方式。其中

CCMenuItemFont是通过设定字体名称来设置字体的,这个字体是系统自带的。见如下代码所示。

CCMenuItemFont的使用:

		CCMenuItemFont::setFontSize(30);
CCMenuItemFont::setFontName("American Typewriter");
CCMenuItemFont *item4 = CCMenuItemFont::create("I toggle enable items", this, menu_selector(MenuLayerMainMenu::menuCallbackEnable) );

首先设置字号字体,支持的字体包括Courier New、Market Felt和Arial等,第一个参数是文字内容,第二个参数

是执行回调函数的目标类,第三个参数是回调函数的名称传入选择器中,当按钮被按下的时候将调用这个回调函数。

2、CCMenuItemAtlasFont则是通过字体配置PNG文件的CCLabelAtlas或者是FNT类型文件的CCLabelBMFont,

即可配置文件所对应的图片,用法见如下代码所示。

CCMenuItemAtlasFont的使用:

		CCLabelAtlas* labelAtlas = CCLabelAtlas::create("0123456789", "fonts/labelatlas.png", 16, 24, '.');
CCMenuItemLabel* item3 = CCMenuItemLabel::create(labelAtlas, this, menu_selector(MenuLayerMainMenu::menuCallbackDisabled) ); CCLabelBMFont* label = CCLabelBMFont::create("configuration", "fonts/bitmapFontTest3.fnt");
CCMenuItemLabel* item5 = CCMenuItemLabel::create(label, this, menu_selector(MenuLayerMainMenu::menuCallbackConfig));

创建函数的第一个参数是文字渲染类CCLabelAtlas或CCLabelBMFont,第二个参数是执行回调函数的目标类,

第三个参数是回调函数的名称传入选择器中,当按钮被按下的时候将调用这个回调函数。

三、精灵菜单项

菜单精灵项CCMenuItemSprite,顾名思义是一个由精灵对象组成的菜单按钮。此类的内部属性,提供了三个精灵

对象,分别表示了按钮的三个状态。这就是正常、选中和无效。换句话来说,此按钮对象中三个按钮的状态,将会以

三个精灵对象的方式来表现。这就丰富了按钮对象的表现方式,给予了我们开发者更大的自由。精灵对象是引擎中最

为丰富和自由的元素。因此类CCMenuItemSprite,算得上是将精灵与按钮功能的结合体。

CCMenuItemSprite的使用:

 CCSprite* spriteNormal = CCSprite::create(s_MenuItem, CCRectMake(0,23*2,115,23));
CCSprite* spriteSelected = CCSprite::create(s_MenuItem, CCRectMake(0,23*1,115,23));
CCSprite* spriteDisabled = CCSprite::create(s_MenuItem, CCRectMake(0,23*0,115,23)); CCMenuItemSprite* item1 = CCMenuItemSprite::create(spriteNormal, spriteSelected, spriteDisabled, this, menu_selector(MenuLayerMainMenu::menuCallback) );

首先定义精灵类对象,然后定义精灵菜单项CCMenuItemSprite,前三个参数分别是普通状态下的按钮、选中状态

下的按钮、无效状态下的按钮,后两个参数是执行回调函数的目标类和回调函数的名称传入选择器中。

CCMenuItemSprite的子类图片菜单项CCMenuItemImage,使用见如下所示代码。

 CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));

CCMenuItemImage和CCMenuItemSprite的区别是图片菜单项直接以图片的路径定义。

四、触发器菜单项

触发器菜单项CCMenuItemToggle类算是比较特殊的。它在内部拥有一个MenuItem数组,用来负责展示不同的按

钮状态,因为使用了一个菜单按钮的数组,所以此类的对象可以实现状态的切换。

CCMenuItemToggle的使用:

  CCMenuItemToggle* item1 = CCMenuItemToggle::createWithTarget(this,
menu_selector(MenuLayer4::menuCallback),
CCMenuItemFont::create( "On" ),
CCMenuItemFont::create( "Off"),
NULL );

它的前两个参数是执行回调函数的目标类和回调函数的名称传入选择器中,后面可以传入菜单项,以NULL结尾,

这样在按下菜单项时,除了调用函数,还会在这些菜单项中切换,适合做游戏音乐开关等。

五、实例:菜单项的使用

1、首先新建Cocos2D-X项目,在HelloWorldScene.h文件中添加一个成员函数如下所示代码。

void menuFun(CCObject* pSender);

此函数用来响应菜单按下的操作来回调方法。

2、然后在HelloWorldScene.cpp文件的init函数中修改如下所示代码。

bool HelloWorld::init()
{
bool bRet = false;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
////////////////////////////////////////////////////////////////////////// CC_BREAK_IF(! CCLayer::init()); //----CCMenuItemFont
CCMenuItemFont* itemFont = CCMenuItemFont::create("StartGame",this,menu_selector(HelloWorld::menuFun));
itemFont->setPosition(ccp(-120,80)); //----CCMenuItemImage
CCMenuItemImage* imageItem = CCMenuItemImage::create("CloseNormal.png","CLoseSelected.png",this,menu_selector(HelloWorld::menuFun));
imageItem->setPosition(ccp(-20,80)); //----CCMenuItemLabel
CCLabelTTF * lableTTF = CCLabelTTF::create("BackMenu", "Helvetica", 20);
CCMenuItemLabel * labelItem =CCMenuItemLabel::create(lableTTF,this,menu_selector(HelloWorld::menuFun));
labelItem->setPosition(ccp(80,80)); //----CCMenuItemSprite
CCSprite* spNor = CCSprite::create("Icon.png");
spNor->setColor(ccc3(255, 255, 0 ));
CCSprite* spSelected =CCSprite::create("Icon.png");
CCMenuItemSprite* spriteItem = CCMenuItemSprite::create(spNor,spSelected, this,menu_selector(HelloWorld::menuFun));
spriteItem->setPosition(ccp(-80,-20)); //----CCMenuItemToggle
CCMenuItemFont * fontItem1 = CCMenuItemFont::create("MusicOpen");
CCMenuItemFont * fontItem2 = CCMenuItemFont::create("MusicClose");
CCMenuItemToggle* toggleItem = CCMenuItemToggle::createWithTarget(this,menu_selector(HelloWorld::menuFun), fontItem1,fontItem2,NULL); CCMenu* menu = CCMenu::create(itemFont,imageItem,labelItem,spriteItem,toggleItem,NULL);
addChild(menu); bRet = true;
} while (0); return bRet;
}

3、最后再添加成员函数menuFun,因为是示例,所以函数中可以什么都不写。

void HelloWorld::menuFun(CCObject* pSender){

}

4、示例效果图。

源码下载地址

【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用的更多相关文章

  1. 蟒蛇书学习笔记——Chapter 09 Section 01 创建和使用类

    9.1 创建和使用类 9.1.1 创建Dog类   根据Dog类创建的每个实例都将存储名字和年龄,我们赋予了每条小狗蹲下(sit( ))和打滚(roll_over( ))的能力: class Dog: ...

  2. 【Cocos2d-X开发学习笔记】第05期:渲染框架之布景层类(CCLayer)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010 图层也是渲染框架中很重要的内容.场景类用来划分游戏的状态 ...

  3. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  4. 【前端】移动端Web开发学习笔记【1】

    下一篇:移动端Web开发学习笔记[2] Part 1: 两篇重要的博客 有两篇翻译过来的博客值得一看: 两个viewport的故事(第一部分) 两个viewport的故事(第二部分) 这两篇博客探讨了 ...

  5. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  6. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  7. 高性能Cordova App开发学习笔记

    高性能Cordova App开发学习笔记 文件结构 添加插件 构建准备 各个www的作用,prepare命令会将hello\www的内容会拷贝到platform下的wwww目录,知道该改哪里了吧?如果 ...

  8. Rest API 开发 学习笔记(转)

    Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...

  9. 步步为营 SharePoint 开发学习笔记系列总结

    转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...

随机推荐

  1. 关于JavaScript中的setTimeout()链式调用和setInterval()探索

    http://www.cnblogs.com/Wenwang/archive/2012/01/06/2314283.html http://www.cnblogs.com/yangjunhua/arc ...

  2. Java [leetcode 31]Next Permutation

    题目描述: Implement next permutation, which rearranges numbers into the lexicographically next greater p ...

  3. ODAC访问oracle时,提示:由于以前的函数求值超时,函数求值被禁用,必须继续执行才能正常返回

    这是因为调试时会自动对Local/Watch等窗口里面(或鼠标停留所在)的变量求值,为了防止用户写的程序错误(比如死循环),系统有一个超时限制,如果某个属性的get中做了很复杂的操作(而不是简单地返回 ...

  4. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.1

    Let $x,y,z$ be linearly independent vectors in $\scrH$. Find a necessary and sufficient condition th ...

  5. mina2

      远程通信 Mina2 学习笔记 作者:李少华 邮箱:xiaosanshaoli@126.com QQ:305409913 2010-12-23   初稿 引言... 1 一.       Mina ...

  6. DDraw绘图

    微软已经提供了GDI+绘图方式,但是GDI+绘图较慢,另外微软提供了效率更高的DirectDraw绘图方式.DirectDraw提供硬件加速功能. 首先需要确保电脑上的Ddraw硬件加速功能已经打开, ...

  7. Codeforces 633D Fibonacci-ish 暴力

    题意:1000个元素,每个元素的大小-1e9<=a[i]<=1e9,然后让你重新安排这些元素的位置 获得最长的前缀斐波那契数列 分析:枚举第一个元素和第二个元素,因为在题目元素的范围内,最 ...

  8. 中文Win7下成功安装calabash-android步骤

    Calabash-android是支持android的UI自动化测试框架,网上看见很多同学说,安装calabash比较费劲,特别是Windows下安装,也没有一个详细的安装手册可供参考.正好,今天在W ...

  9. mysql 清空表的两种方法

    一.Delete DELETE FROM `table`; 二.Truncate TRUNCATE `table`; 第一种方法其实就是去掉where条件,没有了条件,也就是删除掉表里面的所有记录了: ...

  10. 6.1 CUDA: pinned memory固定存储

    CPU和GPU内存交互 在CUDA编程中,内存拷贝是非常费时的一个动作. 从上图我们可以看出:1. CPU和GPU之间的总线bus是PCIe,是双向传输的. 2. CPU和GPU之间的数据拷贝使用DM ...