【Cocos2d-X开发学习笔记】第09期:渲染框架之菜单类(CCMenu)的使用
本系列学习教程使用的是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、示例效果图。