CCMenu
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); |
CCCMenuItemImage
CCMenuItem *imageItem = CCMenuItemImage::create(“CloseNormal.png”,”CloseSelected.png”); imageItem->setTarget(this,menu_selector(Menu::menuCallBack)); |
D CCMenuItemLabel
CCLabelBMFont *bm = CCLabelBMFont::create("bmFontLabelMenu", "fonts/bitmapFontTest.fnt"); CCMenuItem * labelItem = CCMenuItemLabel::create(bm,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,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;
class MYMenu : public CCLayer { public: CREATE_FUNC(MYMenu); bool init(); static CCScene * scene(); void menuCallBack(CCObject * @H_301_1281@obj);
enum MENU { FONT1,FONT2,138); font-family:新宋体; font-size:9.5pt">IMAGE,138); font-family:新宋体; font-size:9.5pt">LABELLABEL,138); font-family:新宋体; font-size:9.5pt">SPRITE,138); font-family:新宋体; font-size:9.5pt">TOGGLE };
CCMenu * @H_301_1281@menu; };
#endif
|
MYMenu.cpp |
#include "MYMenu.h" #include "AppMacros.h"
CCScene * MYMenu::scene() { scene = CCScene::create(); MYMenu * @H_301_1281@layer = create(); scene->addChild(@H_301_1281@layer); return scene; }
//五种菜单 #if 0 CCMenuItemFont; CCMenuItemImage; CCMenuItemLabel; CCMenuItemSprite; CCMenuItemToggle; #endif
bool init() { CCLayer::init();
//第1步:创建一个菜单 @H_301_1281@menu = CCMenu::create();
//第2步:创建菜单项 //可以将下面的两行合并 CCMenuItem * @H_301_1281@fontItem = CCMenuItemFont::create("fontmenu"); @H_301_1281@fontItem->setTarget(this,138); font-family:新宋体; font-size:9.5pt">menu_selector(menuCallBack));
CCLog("first Item :x = %g y = %g",@H_301_1281@fontItem->getPositionX(),0); font-family:新宋体; font-size:9.5pt">getPositionY()); "first Item Anchor x = %g,y = %g",0); font-family:新宋体; font-size:9.5pt">getAnchorPoint().@H_301_1281@x,0); font-family:新宋体; font-size:9.5pt">getAnchorPoint().@H_301_1281@y); "first Item ContentSize width %g hight %g", @H_301_1281@fontItem->getContentSize().@H_301_1281@width,0); font-family:新宋体; font-size:9.5pt">getContentSize().@H_301_1281@height);
//创建第二个Menu条项 CCMenuItem * @H_301_1281@fontItem2 = "fontmenu2"); @H_301_1281@fontItem2->menuCallBack));
//设置Menu在界面中的显示状态 //menu->alignItemsVerticallyWithPadding(40);
"---------------------------------------------"); "Menu:x = %g,@H_301_1281@menu->"Menu Anchor x = %g y = %g",21); font-family:新宋体; font-size:9.5pt">"Menu ContentSize width %g high %g", @H_301_1281@menu->getContentSize().@H_301_1281@height);
//第2步:创建CCMenuItemImage类型的菜单项 CCMenuItem *@H_301_1281@imageItem = CCMenuItemImage::"CloseNormal.png","CloseSelected.png"); @H_301_1281@imageItem->menuCallBack));
//第2步:创建CCLabelBMFont类型的菜单项 CCLabelBMFont * @H_301_1281@bm = CCLabelBMFont::"bmMenu",21); font-family:新宋体; font-size:9.5pt">"fonts/bitmapFontTest.fnt"); CCMenuItem *@H_301_1281@labelItem = CCMenuItemLabel::create(@H_301_1281@bm); @H_301_1281@labelItem->menuCallBack));
//第2步:创建CCSprite类型的菜单项 CCSprite *@H_301_1281@nor = CCSprite::"btn_go_1.png"); CCSprite *@H_301_1281@sel = "btn_go_0.png"); CCMenuItem * @H_301_1281@sprItem = CCMenuItemSprite::create(@H_301_1281@nor,@H_301_1281@sel); @H_301_1281@sprItem->menuCallBack));
//第2步:创建CCMenuItemToggle类型的菜单项 CCMenuItem * @H_301_1281@t1 = "ON"); CCMenuItem * @H_301_1281@t2 = "OFF"); CCMenuItem * @H_301_1281@t3 = "10%"); CCMenuItem * @H_301_1281@t4 = "%50%"); CCMenuItem * @H_301_1281@toggle = CCMenuItemToggle::createWithTarget(this, menuCallBack), @H_301_1281@t1,@H_301_1281@t2,@H_301_1281@t3,@H_301_1281@t4,138); font-family:新宋体; font-size:9.5pt">NULL);
@H_301_1281@menu->addChild(@H_301_1281@fontItem); @H_301_1281@menu->addChild(@H_301_1281@fontItem2); @H_301_1281@menu->addChild(@H_301_1281@imageItem); @H_301_1281@menu->addChild(@H_301_1281@labelItem); @H_301_1281@menu->addChild(@H_301_1281@sprItem); @H_301_1281@menu->addChild(@H_301_1281@toggle); this->addChild(@H_301_1281@menu);
@H_301_1281@menu->alignItemsVertically();
//CCMenu类有一个getChildren()方法可以得到菜单项 CCArray * array = @H_301_1281@menu->getChildren(); CCObject * @H_301_1281@obj; int @H_301_1281@i = 0; CCARRAY_FOREACH(array,@H_301_1281@obj) { CCMenuItem *@H_301_1281@item = (CCMenuItem *)@H_301_1281@obj; @H_301_1281@item->setTag(@H_301_1281@i + 100); @H_301_1281@i++; }
/* for (int i = 0; i < array->count();++i) { CCMenuItem *item = (CCMenuItem *)array->objectAtIndex(i); item->setTag(i); } */
return true; }
//回调函数 void CCObject * @H_301_1281@obj) { CCMenuItem * @H_301_1281@item = (CCMenuItem *)@H_301_1281@obj; switch (@H_301_1281@item->getTag() - 1000) { case FONT1: "font menu call "); break; case FONT2: break; case IMAGE: break; case LABELLABEL: break; case TOGGLE: int @H_301_1281@idx = ((CCMenuItemToggle *)@H_301_1281@item)->getSelectedIndex(); "index = %d",@H_301_1281@idx); break; } } |
运行结果:
|