1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)
CCMenu
基本結(jié)構(gòu)
CCMenu繼承自CCLayer,本質(zhì)是一個(gè)容器。需要被addChild到父類中去。
CCMenuItem是菜單項(xiàng),它有如下子類:
CCMenuItemFont;CCMenuItemImage;CCMenuItemLabel;CCMenuItemSprite;CCMenuItemToggle;
是真正的需要實(shí)例化的菜單項(xiàng)。需要addChild到CCMenu對(duì)象中去。
示例:
| CCMenuItem * item = CCMenuItemFont::create(“Start”); //這里的this表示的是調(diào)用者 Item->setTarget(this,menu_selector(MYMenu::menuCallBack)); CCMenu * menu = CCMenu::create(); menu->addChild(item); addChild(menu); |
CCMenuItem
A? CCMenuItemFont
| CCMenuItem * font = CCMenuItemFont::create(“Start”,this,menu_selector(MYMenu::menuCallBack)); CCMenu * menu = CCMenu::create(); menu->addChild(item); addChild(menu); |
| 第一個(gè)參數(shù)為標(biāo)簽要顯示的文字,第二個(gè)參數(shù)表示回調(diào)函數(shù)的調(diào)用者,第三個(gè)參數(shù)表示回調(diào)函數(shù)。 |
| 關(guān)于回調(diào) typedef void (CCObject::*SEL_MenuHandler)(CCObject *); #define menu_selector(_SELECTOR)(SEL_MenuHandler)(&_SELECTOR) |
?
B? CCMenu的坐標(biāo)系統(tǒng)研究
| fontItem->setPosition(ccp(winSize.width – 50,30)); menu->setPosition(CCPointZero); |
| CCLog("fontItem = %g %g", fontItem->getPositionX(),fontItem->getPositionY()); CCLog("menu = %g, %g,width %g,height = %g",menu->getPositionX(),menu->getPositionY(), menu->getContentSize().width,menu->getContentSize().height); |
?
C?CCMenuItemImage
| CCMenuItem *imageItem = CCMenuItemImage::create(“CloseNormal.png”,”CloseSelected.png”); imageItem->setTarget(this,menu_selector(Menu::menuCallBack)); |
| 第1個(gè)參數(shù)為末點(diǎn)擊是顯示的圖片,第二個(gè)參數(shù)為點(diǎn)擊后顯示的圖片,最后參數(shù)可以放到setTarget中,意義同上。 |
D? CCMenuItemLabel
| CCLabelBMFont *bm = CCLabelBMFont::create("bmFontLabelMenu", "fonts/bitmapFontTest.fnt"); CCMenuItem * labelItem = CCMenuItemLabel::create(bm, this,menu_selector(MYMenu::menuCallBack)); menu->addChild(labelItem); |
??? 第一個(gè)參數(shù)為一個(gè)label,最后兩個(gè)參數(shù)同上。
E? CCMenuItemSprite
| CCSprite * normal = CCSprite::create(“gonormal.png”); CCSprite * selected = CCSprite::create(“goselected.png”); CCMenuItemSprite * spriteItem = CCMenuItemSprite::create(normal,selected,this,menu_selector(MYMenu::menuCallBack)); menu->addChild(spriteItem); |
第一個(gè)參數(shù)和第二個(gè)參數(shù)為CCSprite后面的參數(shù),同上。
CCMenuItemToggle
| CCMenuItem *t1 = CCMenuItemFont::create("ON"); CCMenuItem *t2 = CCMenuItemFont::create("OFF"); CCMenuItem *t3 = CCMenuItemFont::create("10%"); CCMenuItem *t4 = CCMenuItemFont::create("50%"); CCMenuItemToggle * toggle = CCMenuItemToggle::createWithTarget(this, menu_selector(T11Menu::menuCallBack), t1, t2, t3, t4, NULL); menu->addChild(toggle); |
?? 第一個(gè)和第二個(gè)參數(shù)為回調(diào)函數(shù)調(diào)用者和回調(diào)函數(shù),后面的參數(shù)為CCMenuItem.可以實(shí)現(xiàn)變化的菜單。
如何判斷哪個(gè)菜單被點(diǎn)
打Tag
| CCArray * array = menu->getChildren(); CCObject * obj; int i = 0; CCARRAY_FOREACH(array, obj) { CCMenuItem * item = (CCMenuItem *)obj; item->setTag(i + 1000); i++; } |
找Tag
| CCMenuItem * item = (CCMenuItem *)obj; Switch (item->getTag() - 1000) { Case FONT1: ??? CCLog(“CCMenuItemFont”); ??? break; case FONT2: ??? break; case IMAGE: ??? break; case BM: ??? break; case SPRITE: ??? break; case TOGGLE: { ??? int index = ((CCMenuItemToggle *)item)->getSelectedIndex(); ??? CCLog(“index = %d”,index); } break; } |
案例說(shuō)明:
| MYMenu.h |
| #ifndef __MYMENU_H__ #define __MYMENU_H__ #include "cocos2d.h" USING_NS_CC; ? class MYMenu : public CCLayer { public: ??? CREATE_FUNC(MYMenu); ??? bool init(); ??? static CCScene * scene(); ??? void menuCallBack(CCObject * obj); ? ??? enum MENU ??? { ??????? FONT1, FONT2, IMAGE, LABELLABEL, SPRITE, TOGGLE ??? }; ? ??? CCMenu * menu; }; ? #endif ? |
| MYMenu.cpp |
| #include "MYMenu.h" #include "AppMacros.h" ? CCScene * MYMenu::scene() { ??? CCScene * scene = CCScene::create(); ??? MYMenu * layer = MYMenu::create(); ??? scene->addChild(layer); ??? return scene; } ? //五種菜單 #if 0 CCMenuItemFont; CCMenuItemImage; CCMenuItemLabel; CCMenuItemSprite; CCMenuItemToggle; #endif ? bool MYMenu::init() { ??? CCLayer::init(); ? ??? //第1步:創(chuàng)建一個(gè)菜單 ??? menu = CCMenu::create(); ? ??? //第2步:創(chuàng)建菜單項(xiàng) ??? //可以將下面的兩行合并 ??? CCMenuItem * fontItem = CCMenuItemFont::create("fontmenu"); ??? fontItem->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //顯示menuItem在界面中的顯示條項(xiàng) ??? CCLog("first Item :x = %g y = %g", fontItem->getPositionX(), fontItem->getPositionY()); ??? CCLog("first Item Anchor x = %g,y = %g", fontItem->getAnchorPoint().x, fontItem->getAnchorPoint().y); ??? CCLog("first Item ContentSize width %g hight %g", ??????? fontItem->getContentSize().width,fontItem->getContentSize().height); ? ??? //創(chuàng)建第二個(gè)Menu條項(xiàng) ??? CCMenuItem * fontItem2 = CCMenuItemFont::create("fontmenu2"); ??? fontItem2->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //設(shè)置Menu在界面中的顯示狀態(tài) ??? //menu->alignItemsVerticallyWithPadding(40); ? ??? //顯示menu在界面中的顯示特征 ??? CCLog("---------------------------------------------"); ??? CCLog("Menu:x = %g,y = %g", menu->getPositionX(), menu->getPositionY()); ??? CCLog("Menu Anchor x = %g y = %g", menu->getAnchorPoint().x, menu->getAnchorPoint().y); ??? CCLog("Menu ContentSize width %g high %g", ??????? menu->getContentSize().width, ??????? menu->getContentSize().height); ? ??? //第2步:創(chuàng)建CCMenuItemImage類型的菜單項(xiàng) ??? CCMenuItem *imageItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png"); ??? imageItem->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //第2步:創(chuàng)建CCLabelBMFont類型的菜單項(xiàng) ??? CCLabelBMFont * bm = CCLabelBMFont::create("bmMenu", "fonts/bitmapFontTest.fnt"); ??? CCMenuItem *labelItem = CCMenuItemLabel::create(bm); ??? labelItem->setTarget(this,menu_selector(MYMenu::menuCallBack)); ? ??? //第2步:創(chuàng)建CCSprite類型的菜單項(xiàng) ??? CCSprite *nor = CCSprite::create("btn_go_1.png"); ??? CCSprite *sel = CCSprite::create("btn_go_0.png"); ??? CCMenuItem * sprItem = CCMenuItemSprite::create(nor,sel); ??? sprItem->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //第2步:創(chuàng)建CCMenuItemToggle類型的菜單項(xiàng) ??? CCMenuItem * t1 = CCMenuItemFont::create("ON"); ??? CCMenuItem * t2 = CCMenuItemFont::create("OFF"); ??? CCMenuItem * t3 = CCMenuItemFont::create("10%"); ??? CCMenuItem * t4 = CCMenuItemFont::create("%50%"); ??? CCMenuItem * toggle = CCMenuItemToggle::createWithTarget(this, ??????? ???????????????????????????????????????????????????? menu_selector(MYMenu::menuCallBack), ??????????????????????????????????????????????????????????? ?t1,t2,t3,t4,NULL); ? ??? //第3步:將菜單項(xiàng)添加到菜單中去 ??? menu->addChild(fontItem); ??? menu->addChild(fontItem2); ??? menu->addChild(imageItem); ??? menu->addChild(labelItem); ??? menu->addChild(sprItem); ??? menu->addChild(toggle); ??? this->addChild(menu); ??? ??? //第4步:設(shè)置菜單項(xiàng)的顯示方式,讓菜單項(xiàng)垂直顯示 ??? menu->alignItemsVertically(); ? ??? //CCMenu類有一個(gè)getChildren()方法可以得到菜單項(xiàng) ??? CCArray * array = menu->getChildren(); ??? CCObject * obj; ??? int i = 0; ??? CCARRAY_FOREACH(array, obj) ??? { ??????? CCMenuItem *item = (CCMenuItem *)obj; ??????? item->setTag(i + 100); ??????? i++; ??? } ? ??? /* ??? for (int i = 0; i < array->count();++i) ??? { ??????? CCMenuItem *item = (CCMenuItem *)array->objectAtIndex(i); ??????? item->setTag(i); ??? } ??? */ ? ??? return true; } ? //回調(diào)函數(shù) void MYMenu::menuCallBack(CCObject * obj) { ??? CCMenuItem * item = (CCMenuItem *)obj; ??? switch (item->getTag() - 1000) ??? { ??? case FONT1: ??????? CCLog("font menu call "); ??????? break; ??? case FONT2: ??????? break; ??? case IMAGE: ??????? break; ??? case LABELLABEL: ??????? break; ??? case TOGGLE: ??????? int idx = ((CCMenuItemToggle *)item)->getSelectedIndex(); ??????? CCLog("index = %d", idx); ??????? break; ??? } } |
| 運(yùn)行結(jié)果:
|
?
總結(jié)
以上是生活随笔為你收集整理的1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 现在部队文职是什么编制
- 下一篇: 义务兵提干成功给家属报喜怎么报名