首页 > 代码库 > 1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)
1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)
CCMenu
基本结构
CCMenu继承自CCLayer,本质是一个容器。需要被addChild到父类中去。
CCMenuItem是菜单项,它有如下子类:
CCMenuItemFont;CCMenuItemImage;CCMenuItemLabel;CCMenuItemSprite;CCMenuItemToggle;
是真正的需要实例化的菜单项。需要addChild到CCMenu对象中去。
示例:
CCMenuItem * item = CCMenuItemFont::create(“Start”); //这里的this表示的是调用者 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); |
第一个参数为标签要显示的文字,第二个参数表示回调函数的调用者,第三个参数表示回调函数。 |
关于回调 typedef void (CCObject::*SEL_MenuHandler)(CCObject *); #define menu_selector(_SELECTOR)(SEL_MenuHandler)(&_SELECTOR) |
B CCMenu的坐标系统研究
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个参数为末点击是显示的图片,第二个参数为点击后显示的图片,最后参数可以放到setTarget中,意义同上。 |
D CCMenuItemLabel
CCLabelBMFont *bm = CCLabelBMFont::create("bmFontLabelMenu", "fonts/bitmapFontTest.fnt"); CCMenuItem * labelItem = CCMenuItemLabel::create(bm, this,menu_selector(MYMenu::menuCallBack)); menu->addChild(labelItem); |
第一个参数为一个label,最后两个参数同上。
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); |
第一个参数和第二个参数为CCSprite后面的参数,同上。
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); |
第一个和第二个参数为回调函数调用者和回调函数,后面的参数为CCMenuItem.可以实现变化的菜单。
如何判断哪个菜单被点
打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; } |
案例说明:
MYMenu.h |
#ifndef__MYMENU_H__ #define__MYMENU_H__ #include"cocos2d.h" USING_NS_CC;
classMYMenu :publicCCLayer { public: CREATE_FUNC(MYMenu); boolinit(); staticCCScene *scene(); voidmenuCallBack(CCObject * obj);
enumMENU { 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); returnscene; }
//五种菜单 #if 0 CCMenuItemFont; CCMenuItemImage; CCMenuItemLabel; CCMenuItemSprite; CCMenuItemToggle; #endif
boolMYMenu::init() { CCLayer::init();
//第1步:创建一个菜单 menu =CCMenu::create();
//第2步:创建菜单项 //可以将下面的两行合并 CCMenuItem *fontItem =CCMenuItemFont::create("fontmenu"); fontItem->setTarget(this,menu_selector(MYMenu::menuCallBack));
//显示menuItem在界面中的显示条项 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);
//创建第二个Menu条项 CCMenuItem *fontItem2 =CCMenuItemFont::create("fontmenu2"); fontItem2->setTarget(this,menu_selector(MYMenu::menuCallBack));
//设置Menu在界面中的显示状态 //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步:创建CCMenuItemImage类型的菜单项 CCMenuItem *imageItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png"); imageItem->setTarget(this,menu_selector(MYMenu::menuCallBack));
//第2步:创建CCLabelBMFont类型的菜单项 CCLabelBMFont *bm =CCLabelBMFont::create("bmMenu","fonts/bitmapFontTest.fnt"); CCMenuItem *labelItem = CCMenuItemLabel::create(bm); labelItem->setTarget(this,menu_selector(MYMenu::menuCallBack));
//第2步:创建CCSprite类型的菜单项 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步:创建CCMenuItemToggle类型的菜单项 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步:将菜单项添加到菜单中去 menu->addChild(fontItem); menu->addChild(fontItem2); menu->addChild(imageItem); menu->addChild(labelItem); menu->addChild(sprItem); menu->addChild(toggle); this->addChild(menu);
//第4步:设置菜单项的显示方式,让菜单项垂直显示 menu->alignItemsVertically();
//CCMenu类有一个getChildren()方法可以得到菜单项 CCArray * array =menu->getChildren(); CCObject *obj; inti = 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); } */
returntrue; }
//回调函数 voidMYMenu::menuCallBack(CCObject * obj) { CCMenuItem *item = (CCMenuItem *)obj; switch (item->getTag() - 1000) { caseFONT1: CCLog("font menu call "); break; caseFONT2: break; caseIMAGE: break; caseLABELLABEL: break; caseTOGGLE: intidx = ((CCMenuItemToggle *)item)->getSelectedIndex(); CCLog("index = %d",idx); break; } } |
运行结果: |
1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)