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;
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步:创建一个菜单
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;
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;
}
//回调函数
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;
}
}
运行结果: