您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x基本知识点(8):菜单项

2014-09-15 12:22 344 查看
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,很多情况需要先判断“画在上面”的按钮,这时就需要修改代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: