您好,登錄后才能下訂單哦!
【嘮叨】
菜單按鈕在游戲中是經(jīng)常被用到的,比如主菜單界面的菜單選項(xiàng),暫停游戲時(shí)的菜單選項(xiàng)等等。cocos2dx引擎同樣為我們提供了CCMenu菜單的功能,并包含了一些簡(jiǎn)單的菜單項(xiàng)CCMenuItem。且菜單項(xiàng)附帶觸碰按鈕時(shí),自動(dòng)放大的效果。
溫馨提示:本節(jié)內(nèi)容比較多,需要大家慢慢分析,不要急于求成。
本節(jié)組織結(jié)構(gòu)如下:
一、介紹CCMenu。
二、介紹CCMenuItem,及其具體的六個(gè)子類。
三、代碼實(shí)戰(zhàn)。
【Demo下載】
https://github.com/shahdza/Cocos_LearningTest/tree/master/demo_%E8%8F%9C%E5%8D%95CCMenu%E3%80%81CCMenuItem
【3.x】
(1)去掉“CC”
(2)其他函數(shù)的增加與刪除稍微做了變化,可以自己在開發(fā)過程中掌握。
【菜單CCMenu】
菜單CCMenu是專門用來承載菜單按鈕的CCLayer圖層,圖層中的子節(jié)點(diǎn)只能夠是菜單項(xiàng)CCMenuItem或其子類。通常先創(chuàng)建菜單項(xiàng)CCMenuItem,然后使用一個(gè)或多個(gè)菜單項(xiàng)生成菜單CCMenu,最后把CCMenu加入當(dāng)前CCLayer圖層。
繼承關(guān)系如下:
如果直接在層中添加CCMenuItem也可以正常顯示,但是無法響應(yīng)回調(diào)函數(shù),因?yàn)镃CMenu是繼承至CCLayer,也就繼承了觸摸的相關(guān)事件,而CCMenuItem只是從CCNode繼承而來,并不響應(yīng)觸摸,因此無法調(diào)用回調(diào)函數(shù)。
由于CCMenu的父類為CCLayer,所以錨點(diǎn)為(0,0),且無法設(shè)置錨點(diǎn)。CCMenu的默認(rèn)原點(diǎn)坐標(biāo)為屏幕正中心(winSize.width/2, winSize.height/2)。
而對(duì)于CCMenuItem是添加在CCMenu層中的,所以CCMenuItem的位置是相對(duì)于CCMenu層的偏移位置。CCMenuItem相對(duì)于CCMenu的偏移量默認(rèn)為(0,0),且菜單項(xiàng)的錨點(diǎn)默認(rèn)為(0.5,0.5)。
如下圖所示:
值得注意的是:CCMenu包含了多個(gè)子菜單項(xiàng),每個(gè)子菜單項(xiàng)的位置都不一樣,如果定義了CCMenu的位置,那它作為父節(jié)點(diǎn)會(huì)影響到所有的子菜單項(xiàng)的位置,所以一般我們都是吧CCMenu的位置設(shè)置在CCPointZero,然后設(shè)置CCMenuItem的位置(也就是相對(duì)父節(jié)點(diǎn)的偏移量)來定位整個(gè)菜單。
常用操作如下:
// class CC_DLL CCMenu : public CCLayerRGBA { /** * 創(chuàng)建菜單的三個(gè)常用方法 */ //創(chuàng)建一個(gè)空菜單 static CCMenu* create(); //CCMenu::create(item1,item2,item3,NULL); //用CCMenuItem菜單項(xiàng)創(chuàng)建菜單,最后以NULL表示結(jié)束. static CCMenu* create(CCMenuItem* item, ...); //用一個(gè)包含CCMenuItem的CCArray數(shù)組來創(chuàng)建菜單 static CCMenu* createWithArray(CCArray* pArrayOfItems); /** * 菜單布局方式 * 注意:使用以下函數(shù)進(jìn)行菜單布局時(shí),將會(huì)把整體菜單項(xiàng)的相對(duì)于CCMenu的偏移坐標(biāo)設(shè)置到(0,0)。 * 所以布局后,應(yīng)該設(shè)置CCMenu菜單的坐標(biāo)為屏幕正中心(winSize.width/2, winSize.height/2),效果更加。 * alignItemsVertically , alignItemsHorizontally , * alignItemsInColumns , alignItemsInRows */ //讓menu的所有item豎著布局 //item1 //item2 //item3 void alignItemsVertically(); //默認(rèn)間隙:5個(gè)像素 void alignItemsVerticallyWithPadding(float padding); //相連兩個(gè)item間隔為padding //讓menu的所有item橫著布局 //item1 item2 item3 void alignItemsHorizontally(); //默認(rèn)間隙:5個(gè)像素 void alignItemsHorizontallyWithPadding(float padding); //相連兩個(gè)item間隔為padding //將items進(jìn)行分組,然后按列(columns)進(jìn)行排列 //每一組在同一行,參數(shù)columns表示每一組的菜單項(xiàng)個(gè)數(shù),并以NULL表示結(jié)束。 //alignItemsInColumns(3,2,1,NULL); //item1 item2 item3 // item4 item5 // item6 void alignItemsInColumns(unsigned int columns, ...); //將items進(jìn)行分組,然后按行(rows)進(jìn)行排列。與上述類似。 //alignItemsInRows(3,2,1,NULL); //item1 // item4 //item2 item6 // item5 //item3 void alignItemsInRows(unsigned int rows, ...); /** * 添加、刪除item菜單項(xiàng) * addChild , removeChild */ virtual void addChild(CCNode * child); virtual void addChild(CCNode * child, int zOrder); virtual void addChild(CCNode * child, int zOrder, int tag); virtual void removeChild(CCNode* child, bool cleanup); /** * 設(shè)置菜單是否可用 * setEnabled */ virtual void setEnabled(bool value) { m_bEnabled = value; }; virtual bool isEnabled() { return m_bEnabled; } }; //
【菜單項(xiàng)CCMenuItem】
CCMenuItem繼承自CCNode,所以它的子類菜單項(xiàng)都可以使用CCNode的相關(guān)操作。
CCMenuItem是所有菜單項(xiàng)的父類,建議不要直接使用該類,因?yàn)樗⒉话唧w顯示的功能。
作為其它菜單項(xiàng)的父類,主要提供了一下三個(gè)功能:
(1)提供了基本按鈕的狀態(tài):正常、選中、禁用。
(2)為按鈕實(shí)現(xiàn)了基本的回調(diào)函數(shù)機(jī)制。當(dāng)玩家點(diǎn)積按鈕后,就會(huì)調(diào)用執(zhí)行相應(yīng)的回調(diào)函數(shù)。
(3)觸碰菜單項(xiàng),附有自動(dòng)放大效果。
菜單項(xiàng)的子類可以分成三類,總共六個(gè):
(1)文字菜單項(xiàng):CCMenuItemLabel、CCMenuItemAtlasFont、CCMenuItemFont;
(2)圖片菜單項(xiàng):CCMenuItemSprite、CCMenuItemImage;
(3)切換菜單項(xiàng):CCMenuItemToggle。
繼承關(guān)系如下圖所示:
1、CCMenuItemLabel
CCMenuItemLabel是一個(gè)包含了文字標(biāo)簽的菜單項(xiàng)按鈕,CCLabel的三個(gè)標(biāo)簽CCLabelBMFont ,CCLabelAtlas,CCLabelTTF對(duì)象,都可以放置在該按鈕對(duì)象中。
常用操作如下:
// class CC_DLL CCMenuItemLabel : public CCMenuItem { /** * 創(chuàng)建CCMenuItemLabel * 支持字體標(biāo)簽類:CCLabelBMFont , CCLabelAtlas , CCLabelTTF */ //用label字體標(biāo)簽創(chuàng)建,不設(shè)置回調(diào)響應(yīng)事件。 //label可以是CCLabelBMFont , CCLabelAtlas , CCLabelTTF三種文字標(biāo)簽。 static CCMenuItemLabel* create(CCNode *label); //用label字體標(biāo)簽創(chuàng)建,并設(shè)置回調(diào)響應(yīng)事件。 // target:執(zhí)行當(dāng)前按鈕的對(duì)象,一般為this。表示由CCLayer圖層執(zhí)行回調(diào)響應(yīng)事件。 // selector:使用菜單回調(diào)函數(shù)menu_selector。一般在當(dāng)前CCLayer圖層中定義。 //create( label, this , menu_selector( HelloWorld::func1 ) ); static CCMenuItemLabel * create(CCNode*label, CCObject* target, SEL_MenuHandler selector); /** * 屬性設(shè)置 * setString , setEnabled , setDisabledColor , setLabel */ //設(shè)置內(nèi)部字體標(biāo)簽(CCLabel)的顯示文字內(nèi)容 void setString(const char * label); //設(shè)置該CCMenuItemLabel對(duì)象是否可用 virtual void setEnabled(bool enabled); virtual bool isSelected(); //禁用時(shí)的顏色 virtual void setDisabledColor(ccColor3B&); virtual const ccColor3B& getDisabledColor(); //被渲染的字體,可以是CCLabelBMFont , CCLabelAtlas , CCLabelTTF。 virtual void setLabel(CCNode*); virtual CCNode* getLabel(); }; //
2、CCMenuItemAtlasFont
CCMenuItemAtlasFont的父類為CCMenuItemLabel。
和父類的區(qū)別在于:該類在創(chuàng)建時(shí),只要設(shè)置顯示內(nèi)容、使用的字體資源.png即可。它默認(rèn)使用CCLabelAtlas來創(chuàng)建文字標(biāo)簽的菜單項(xiàng)按鈕。而省去了父類創(chuàng)建label的步驟。
該類和父類相比,并未做其他屬性或函數(shù)的擴(kuò)展。
常用操作如下:
// class CC_DLL CCMenuItemFont : public CCMenuItemLabel { /** * 創(chuàng)建CCMenuItemFont */ //創(chuàng)建基于CCLabelAtlas字體標(biāo)簽的CCMenuItemAtlasFont,不帶回調(diào)響應(yīng)事件。 //create("20140818" , "digit.png" , 20 , 20 , '0' ); //create("20140818" , "digit.png" , 20 , 20 , '0' , this , menu_selector( HelloWorld::func2 ) ); static CCMenuItemAtlasFont* create(const char *value, const char *charMapFile, int itemWidth, int itemHeight, char startCharMap); static CCMenuItemAtlasFont* create(const char *value, const char *charMapFile, int itemWidth, int itemHeight, char startCharMap, CCObject* target, SEL_MenuHandler selector); }; //
3、CCMenuItemFont
CCMenuItemAtlasFont的父類為CCMenuItemLabel。
和父類的區(qū)別在于:該類在創(chuàng)建時(shí),只要設(shè)置顯示內(nèi)容即可。它默認(rèn)使用CCLabelTTF來創(chuàng)建文字標(biāo)簽的菜單項(xiàng)按鈕。而省去了父類創(chuàng)建label的步驟。
和父類相比,可以設(shè)置字體大小。
常用操作如下:
// class CC_DLL CCMenuItemFont : public CCMenuItemLabel { /** * 創(chuàng)建CCMenuItemFont */ //create(要顯示的字符串) //create(要顯示的字符串,執(zhí)行當(dāng)前按鈕的對(duì)象,回調(diào)函數(shù)) // target:執(zhí)行當(dāng)前按鈕的對(duì)象,一般為this。表示由CCLayer圖層執(zhí)行回調(diào)響應(yīng)事件。 // selector:使用菜單回調(diào)函數(shù)menu_selector。一般在當(dāng)前CCLayer圖層中定義。 //create( "hello" , this , menu_selector( HelloWorld::func3 ) ); static CCMenuItemFont * create(const char *value); static CCMenuItemFont * create(const char *value, CCObject* target, SEL_MenuHandler selector); /** * 屬性設(shè)置 */ //這是一個(gè)全局靜態(tài)方法,用來設(shè)置新創(chuàng)建CCMenuItemFont時(shí)的默認(rèn)字體大小的 //在不進(jìn)行設(shè)置時(shí),創(chuàng)建的CCMenuItemFont,默認(rèn)大小為32。 //CCMenuItemFont::setFontSize(32); static void setFontSize(unsigned int s); static unsigned int fontSize(); //這是一個(gè)全局靜態(tài)方法,用來設(shè)置新創(chuàng)建CCMenuItemFont時(shí)的默認(rèn)字體資源.fnt的 //在不進(jìn)行設(shè)置時(shí),創(chuàng)建的CCMenuItemFont,默認(rèn)字體為"Marker Felt"。 //CCMenuItemFont::setFontName("Arial"); static void setFontName(const char *name); static const char *fontName(); //設(shè)置該對(duì)象的字體大小及使用的字體資源名.fnt void setFontSizeObj(unsigned int s); unsigned int fontSizeObj(); void setFontNameObj(const char* name); const char* fontNameObj(); }; //
4、CCMenuItemSprite
CCMenuItemSprite是一個(gè)由精靈對(duì)象組成的菜單按鈕。
此類的內(nèi)部屬性提供了三個(gè)精靈對(duì)象,分別表示按鈕的三個(gè)狀態(tài):正常、選中、禁用。每種狀態(tài)都分別對(duì)應(yīng)了一個(gè)精靈圖片。
精靈是引擎中最為豐富和自由的元素,因此類CCMenuItemSprite算得上是將精靈和按鈕功能的結(jié)合體。
常用操作如下:
// class CC_DLL CCMenuItemSprite : public CCMenuItem { /** * 創(chuàng)建CCMenuItemSprite */ //參數(shù): // normalSprite: 正常時(shí)的默認(rèn)精靈normalSprite // selectedSprite:被選中時(shí)的精靈selectedSprite // disabledSprite:禁用時(shí)的精靈disabledSprite // target:執(zhí)行當(dāng)前按鈕的對(duì)象,一般為this。表示由CCLayer圖層執(zhí)行回調(diào)響應(yīng)事件。 // selector:使用菜單回調(diào)函數(shù)menu_selector。一般在當(dāng)前CCLayer圖層中定義。 //CCSprite* normalSprite = CCSprite::create("sp1.png"); //CCSprite* selectedSprite = CCSprite::create("sp2.png"); //CCSprite* disabledSprite = CCSprite::create("sp3.png"); //create(normalSprite, selectedSprite, disabledSprite, this, menu_selector(HelloWorld::func4) ); static CCMenuItemSprite * create(CCNode* normalSprite, CCNode* selectedSprite, CCNode* disabledSprite = NULL); static CCMenuItemSprite * create(CCNode* normalSprite, CCNode* selectedSprite, CCObject* target, SEL_MenuHandler selector); static CCMenuItemSprite * create(CCNode* normalSprite, CCNode* selectedSprite, CCNode* disabledSprite, CCObject* target, SEL_MenuHandler selector); /** * 設(shè)置三種狀態(tài)的精靈CCSprite */ //正常時(shí)的默認(rèn)圖片normalSprite //被選中時(shí)的圖片selectedSprite //禁用時(shí)的圖片disabledSprite virtual void setNormalImage(CCNode* normalSprite); virtual CCNode* getNormalImage(); virtual void setSelectedImage(CCNode* selectedSprite); virtual CCNode* getSelectedImage(); virtual void setDisabledImage(CCNode* disabledSprite); virtual CCNode* getDisabledImage(); /** * 設(shè)置選中、禁用 */ virtual void selected(); //選中 virtual void unselected(); //取消選中 virtual void setEnabled(bool bEnabled); //是否啟用。false禁用。 }; //
5、CCMenuItemImage
CCMenuItemImage繼承自CCMenuItemSprite,并沒有太大的變化。只是提供了更為簡(jiǎn)捷的方式,將原本按鈕中的精靈對(duì)象換為了三張紋理圖片。無需創(chuàng)建精靈對(duì)象,就可以直接創(chuàng)建一個(gè)精靈按鈕對(duì)象。
與父類相比,省去了創(chuàng)建CCSprite精靈對(duì)象的過程。實(shí)際上在create創(chuàng)建的過程中,已經(jīng)幫你做了創(chuàng)建CCSprite的過程了。
常用操作如下:
// class CC_DLL CCMenuItemImage : public CCMenuItemSprite { /** * 創(chuàng)建CCMenuItemImage */ //與CCMenuItemSprite創(chuàng)建方式差不多。就是參數(shù)變成了圖片資源(如*.png) //create("sp1.png", "sp2.png", "sp3.png", this, menu_selector(HelloWorld::func5) ); static CCMenuItemImage* create(const char *normalImage, const char *selectedImage); static CCMenuItemImage* create(const char *normalImage, const char *selectedImage, const char *disabledImage); static CCMenuItemImage* create(const char *normalImage, const char *selectedImage, CCObject* target, SEL_MenuHandler selector); static CCMenuItemImage* create(const char *normalImage, const char *selectedImage, const char *disabledImage, CCObject* target, SEL_MenuHandler selector); /** * 屬性設(shè)置 */ //用CCSpriteFrame精靈幀,設(shè)置正常時(shí)的精靈幀Normal void setNormalSpriteFrame(CCSpriteFrame* frame); //用CCSpriteFrame精靈幀,設(shè)置選中時(shí)的精靈幀Selected void setSelectedSpriteFrame(CCSpriteFrame* frame); //用CCSpriteFrame精靈幀,設(shè)置禁用時(shí)的精靈幀Disabled void setDisabledSpriteFrame(CCSpriteFrame* frame); }; //
6、CCMenuItemToggle
CCMenuItemToggle是比較特殊的。它在內(nèi)部擁有一個(gè)CCMenuItem菜單項(xiàng)數(shù)組,用來負(fù)責(zé)展示不同的菜單項(xiàng)按鈕狀態(tài)。因?yàn)槭褂昧艘粋€(gè)菜單按鈕的數(shù)組,所以此類的對(duì)象可以實(shí)現(xiàn)狀態(tài)的切換。此類是一個(gè)菜單項(xiàng)按鈕對(duì)象的集合,能夠包含很多的菜單項(xiàng)按鈕狀態(tài),方便開發(fā)者進(jìn)行切換。
例如,CCMenuItemToggle可以用來做開關(guān)按鈕。
常用操作如下:
// class CC_DLL CCMenuItemToggle : public CCMenuItem { /** * 創(chuàng)建CCMenuItemToggle * create 或 createWithTarget */ //使用一個(gè)菜單項(xiàng)創(chuàng)建CCMenuItemToggle對(duì)象 //CCMenuItemFont* item = CCMenuItemFont::create("hello"); //CCMenuItemToggle::create(item); static CCMenuItemToggle* create(CCMenuItem *item); //使用菜單項(xiàng)參數(shù)列表創(chuàng)建,以NULL結(jié)束列表 //item1 = CCMenuItemFont::create("hello"); //item2 = CCSprite::create("sp1.png"): //createWithTarget(this, menu_selector(HelloWorld::func6), item1, item2, NULL); static CCMenuItemToggle* createWithTarget(CCObject* target, SEL_MenuHandler selector, CCMenuItem* item, ...); //使用包含菜單項(xiàng)的數(shù)組創(chuàng)建 //createWithTarget(this, menu_selector(HelloWorld::func6), pArray); static CCMenuItemToggle * createWithTarget(CCObject* target, SEL_MenuHandler selector, CCArray* menuItems); /** * 菜單項(xiàng)數(shù)組集合相關(guān) * setSelectedIndex , selectedItem , * setSubItems , addSubItem */ //設(shè)置當(dāng)前選中的CCMenuItem的索引值(即數(shù)組下標(biāo)) virtual void setSelectedIndex(unsigned int ); virtual unsigned int getSelectedIndex(); //返回當(dāng)前選中的菜單項(xiàng) CCMenuItem* selectedItem(); //設(shè)置CCMenuItem菜單項(xiàng)數(shù)組集合 virtual void setSubItems(CCArray* ); virtual CCArray* getSubItems(); //添加新的子菜單項(xiàng) void addSubItem(CCMenuItem *item); }; //
【代碼實(shí)戰(zhàn)】
首先,在實(shí)戰(zhàn)的過程中會(huì)遇到有關(guān)回調(diào)函數(shù)的概念,這里就簡(jiǎn)單來說一下什么事回調(diào)函數(shù)。
回調(diào)函數(shù)其實(shí)就是:當(dāng)按鈕被觸碰時(shí),會(huì)執(zhí)行相應(yīng)的函數(shù)。類似于鼠標(biāo)點(diǎn)擊綁定的click響應(yīng)事件處理函數(shù)。
1、在HelloWorldScene.h中添加如下兩個(gè)回調(diào)函數(shù)
// //添加回調(diào)響應(yīng)函數(shù) void menuItemFont2Func(CCObject* sender); //更改標(biāo)簽內(nèi)容 void menuItemToggleFunc(CCObject* sender); //更改狀態(tài):正常,選中,禁用 //
2、編寫測(cè)試代碼
// bool HelloWorld::init() { if ( !CCLayer::init() ) { return false; } //獲取可視區(qū)域尺寸大小 CCSize mysize = CCDirector::sharedDirector()->getVisibleSize(); //獲取可視區(qū)域的原點(diǎn)位置 CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); //屏幕正中心位置 CCPoint midPos = ccp(mysize.width/2, mysize.height/2); /* * 創(chuàng)建CCMenuItemLabel * 使用CCLabelTTF創(chuàng)建 */ CCLabelTTF* lb1 = CCLabelTTF::create("aaaaaa", "Arial", 32); CCMenuItemLabel* menuItemLabel = CCMenuItemLabel::create(lb1); //設(shè)置位置 menuItemLabel->setPosition( ccp(120, mysize.height-50) ); /* * 創(chuàng)建CCMenuItemAtlasFont * 創(chuàng)建方式與CCLabelAtlas類似 */ CCMenuItemAtlasFont* menuItemAtlas = CCMenuItemAtlasFont::create("20140818", "fonts/digit.png", 20, 20, '0'); menuItemAtlas->setPosition( ccp(120, mysize.height-120) ); /* * 創(chuàng)建CCMenuItemFont * 創(chuàng)建了兩個(gè),有無附帶回調(diào)響應(yīng)函數(shù) */ //設(shè)置CCMenuItemFont創(chuàng)建時(shí)的默認(rèn)字體大小 CCMenuItemFont::setFontSize(50); //不帶回調(diào)響應(yīng)函數(shù),tag編號(hào)為1 CCMenuItemFont* menuItemFont1 = CCMenuItemFont::create("11111"); menuItemFont1->setTag(1); //觸碰后,執(zhí)行回調(diào)函數(shù)menuItemFont2Func。更改menuItemFont1的內(nèi)容 CCMenuItemFont* menuItemFont2 = CCMenuItemFont::create("Change1", this, menu_selector(HelloWorld::menuItemFont2Func) ); //回調(diào) menuItemFont2->setFontSizeObj(32); //設(shè)置字體大小 menuItemFont1->setPosition( ccp(120, mysize.height-190) ); //設(shè)置位置 menuItemFont2->setPosition( ccp(120, mysize.height-260) ); //設(shè)置位置 /* * 創(chuàng)建CCMenu,tag編號(hào)為100 * 菜單項(xiàng)menuItemLabel, menuItemAtlas, menuItemFont1, menuItemFont2 */ CCMenu* menu = CCMenu::create(menuItemLabel, menuItemAtlas, menuItemFont1, menuItemFont2, NULL); //設(shè)置位置為(0,0),與HelloWorld層重合 menu->setPosition(CCPointZero); //將CCMenu菜單添加到CCLayer中, tag編號(hào)為100 this->addChild(menu, 0, 100); /* * 創(chuàng)建CCMenuItemSprite * 參數(shù)為CCSprite精靈 */ CCSprite* sp1 = CCSprite::create("sp1.png"); CCSprite* sp2 = CCSprite::create("sp2.png"); CCSprite* sp3 = CCSprite::create("sp3.png"); CCMenuItemSprite* menuItemSprite = CCMenuItemSprite::create(sp1, sp2, sp3 ); menuItemSprite->setPosition( ccp(mysize.width/2 + 50, mysize.height/2 + 50) ); menu->addChild(menuItemSprite); //添加到菜單層中 menuItemSprite->setTag(2); //tag編號(hào)為2 /* * 創(chuàng)建CCMenuItemImage * 參數(shù)變成紋理圖片png */ //使用CCMenuItemImage創(chuàng)建一個(gè)關(guān)閉程序的菜單項(xiàng)按鈕 CCMenuItemImage* menuItemImage = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback) ); //回調(diào) menuItemImage->setPosition( ccp(mysize.width - 40, mysize.height - 40) ); menu->addChild(menuItemImage); //添加到菜單層中 /* * 創(chuàng)建CCMenuItemToggle * 參數(shù)為CCMenuItem子類 */ CCMenuItemFont::setFontSize(20); CCMenuItemFont* menuItemFont3 = CCMenuItemFont::create("Toggle_Normal"); CCMenuItemFont* menuItemFont4 = CCMenuItemFont::create("Toggle_Selected"); CCMenuItemImage* menuItemImage2 = CCMenuItemImage::create("sp3.png", "sp1.png"); //創(chuàng)建CCMenuItemToggle,回調(diào)函數(shù):更改menuItemSprite的狀態(tài)。 CCMenuItemToggle* menuItemToggle = CCMenuItemToggle::createWithTarget(this, menu_selector(HelloWorld::menuItemToggleFunc), menuItemFont3, menuItemFont4, NULL ); //菜單項(xiàng)參數(shù)列表 menuItemToggle->setPosition( ccp(mysize.width/2 + 50, mysize.height/2 - 50) ); //設(shè)置位置 //將menuItemImage2添加到menuItemToggle中 menuItemToggle->addSubItem(menuItemImage2); menu->addChild(menuItemToggle); //添加到菜單層中 return true; } //
3、編寫回調(diào)響應(yīng)函數(shù)的代碼
// /* * 回調(diào)函數(shù)menuItemFont2Func */ //變化menuItemFont1的內(nèi)容 void HelloWorld::menuItemFont2Func(CCObject* sender) { //獲取menuItemFont2 CCMenuItemFont* menuItemFont2 = (CCMenuItemFont*)sender; //從CCLayer中獲取CCMenu菜單 CCMenu* menu = (CCMenu*)this->getChildByTag(100); //獲取menuItemFont1,其tag為1 //!??!注意?。。? // tag是相對(duì)父節(jié)點(diǎn)而言的:this的子節(jié)點(diǎn)中沒有tag為1,而menuItemFont1是menu中tag為1的子節(jié)點(diǎn)。 CCMenuItemFont* menuItemFont1 = (CCMenuItemFont*)menu->getChildByTag(1); //更改menuItemFont1的內(nèi)容 //獲取menuItemFont2顯示的標(biāo)簽內(nèi)容 CCLabelTTF* lb = (CCLabelTTF*)menuItemFont2->getLabel(); //strcmp判斷是否等于Change1 if( strcmp( lb->getString() , "Change1") == 0 ) { lb->setString("Change2"); menuItemFont1->setString("22222"); }else { lb->setString("Change1"); menuItemFont1->setString("11111"); } } /* * 回調(diào)函數(shù)menuItemToggleFunc */ //更改狀態(tài):正常,選中,禁用 void HelloWorld::menuItemToggleFunc(CCObject* sender) { //獲取menuItemToggle CCMenuItemToggle* menuItemToggle = (CCMenuItemToggle*)sender; //從CCLayer中獲取CCMenu菜單 CCMenu* menu = (CCMenu*)this->getChildByTag(100); //獲取menuItemSprite CCMenuItemSprite* menuItemSprite = (CCMenuItemSprite*)menu->getChildByTag(2); //根據(jù)menuItemToggle當(dāng)前被選中的是哪一項(xiàng),來設(shè)置menuItemSprite的狀態(tài) switch( menuItemToggle->getSelectedIndex() ) { case 0: //正常 menuItemSprite->setEnabled(true); break; case 1: //選中 menuItemSprite->selected(); break; case 2: //禁用 menuItemSprite->setEnabled(false); break; } } //
4、運(yùn)行結(jié)果截圖
點(diǎn)擊Change1按鈕,執(zhí)行回調(diào)函數(shù)menuItemFont2Func。“11111”變成“22222”。
點(diǎn)擊“Toggle_Normal”按鈕,精靈圖片變成選中時(shí)的圖片。
再次點(diǎn)擊“Toggle_Selected”按鈕,精靈圖片變成禁用時(shí)的圖片。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。