溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem

發(fā)布時(shí)間:2020-06-30 10:10:15 來源:網(wǎng)絡(luò) 閱讀:9584 作者:shahdza 欄目:開發(fā)技術(shù)

【嘮叨】

    菜單按鈕在游戲中是經(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)系如下:

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem


    如果直接在層中添加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)。

    如下圖所示:

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItemcocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem

    值得注意的是: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)系如下圖所示:

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem


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é)果截圖

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem

        點(diǎn)擊Change1按鈕,執(zhí)行回調(diào)函數(shù)menuItemFont2Func。“11111”變成“22222”。

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem

        點(diǎn)擊“Toggle_Normal”按鈕,精靈圖片變成選中時(shí)的圖片。

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem

        再次點(diǎn)擊“Toggle_Selected”按鈕,精靈圖片變成禁用時(shí)的圖片。

cocos2dx基礎(chǔ)篇(7)——菜單按鈕CCMenu/CCMenuItem



向AI問一下細(xì)節(jié)

免責(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)容。

AI