CCMenuItem是一个基类,它的子类可以加入CCMenu中形成菜单。
标签菜单项:使用字体定义的菜单项,包括CCMenuItemAtlasFont和CCMenuItemFont两种方式。
CCMenuItemFont:
CCMenuItemFont::setFontSize(30);
CCMenuItemFont::setFontName("Courier New");
CCMenuItemFont* item4 = CCMenuItemFont::create("I toggle enable items",this,menu_selector(
MenuLayerMainMenu::menuCallbackEnable));
CCMenuItemAtlasFont:
即配置 文件所对应的图片:CCMenuItemAtlasFont 是通过字体配置PNG文件的CCLabelAtlas或是FNT类型文件的CCLabelBMFont,
CCLabelAtlas* labelAtlas = CCLabelAtlas::create("0123456789","fonts/labelatlas.png",16,24,'.');
CCMenuItemLabel* item3 = CCMenuItemLabel::create(labelAtlas ,this,menu_selector(MMM::menuCallbackDisabled));
CCLabelBMFont* label = CCLabelBMFont::create("configuration","fonts/bitmapFontTest3.fnt");
CCMenuItemLabel* item5 = CCMenuItemLabel::create(label,this,menu_selector(MMM::menuCallbackConfig));
精灵菜单项
精灵菜单项CCMenuItemSprite的特点是可以封装图片进入菜单项:
CCSprite* spriteNormal = CCSprite::create(s_MenuItem,CCRectMake(0,23*2,115,23));
CCSprite* spriteSelected = CCSprite::create(s_menuItem,CCRectMake(0,23*1,115,23));
CCSprite* spriteDisabled = CCSprite::create(s_MenuItem,CCRectMake(0,23*0,115,23));
CCMenuItemSprite* item1 = CCMenuItemSprite::create(spriteNormal,spriteSelected,spriteDisabled,this,
menu_selector(MenuLayerMainMenu::menuCallback));
CCMenuItemSprite 的子类图片菜单项CCMenuItemImage:
CCMenuItemImage* item1 = CCMenuItemImage::create("images/btn-play-normal.png","images/btn-play-selected.png",
this,menu_selector(MenuLayer2::menuCallback));
CCMenuItemImage和CCMenuItemSprite的区别是图片菜单项直接以图片的路径定义。
触发器菜单项
触发器菜单项CCMenuItemToggle可以将任意的菜单项传进去,作为一个触发器按钮式的开关:
CCMenuItemToggle* item1 = CCMenuItemToggle::create(this,menu_selector(MenuLayer4::menuCallback),
CCMenuItemFont::create("On"),CCMenuItemFont::create("Off"),NULL);
在按下菜单项时,除了调用函数,还会在这些菜单项中切换,适合做游戏开关等。
菜单项的使用示例:
MenuLayerMainMenu::MenuLayerMainMenu(){
//定义菜单项的部分省略,item1到item7
CCMenu* menu = CCMenu::create(item1,...,item7,NULL);
menu->alignItemsVertically();
CCSize s = CCDirector::sharedDirector()->getWinSize();
int i =0;
CCNode* child;
CCArray* pArray = menu->getChildren();
CCObject* pObject = NULL;
CCARRAY_FOREACH(pArray,pObject){
if(pObject == NULL)
break;
child = (CCNode*)pObject;
CCPoint dstPoint = child->getPosition();
int offset = (int)(s.width/2 + 50);
if(i%2 == 0)
offset = -offset;
child->setPosition(CCPointMake(dstPoint.x + offset,dstPoint.y));
child->runAction(CCEaseElasticOut::create(CCMoveBy::create(2,CCPointMake(dstPoint.x - offset,0)),0.35f));
i++;
}
m_disabledItem = item3;
item3->retain();
m_disabledItem->setEnabled(false);
addChild(menu);
menu->setPosition(ccp(s.width/2,s.height/2));
}
需要注意的是,有时按钮之间会有叠加的情况,这时候点击叠加区域会如何判断呢?通过查看CCMenu类的遍历菜单项函数itemForTouch 发现,这个判断是根据菜单项数组中的位置先后来判断的,而菜单项的渲染也遵循这个顺序,but,很多情况需要先判断“画在上面”的按钮,这时就需要修改代码。