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

这篇博客介绍了cocos2d-x中的菜单项概念,包括CCMenuItem的基类和子类如CCMenuItemFont、CCMenuItemAtlasFont、CCMenuItemLabel、CCMenuItemSprite以及CCMenuItemToggle的使用。内容详细讲解了如何创建和配置各种菜单项,以及它们在实际应用中的交互和行为。特别提到了CCMenuItemToggle作为触发器菜单项的特性,适用于游戏开关场景,并探讨了按钮叠加时的点击判断问题。
摘要由CSDN通过智能技术生成

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,很多情况需要先判断“画在上面”的按钮,这时就需要修改代码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值