菜单制作,事件处理

来源:互联网 发布:lol美服mac版下载 编辑:程序博客网 时间:2024/04/29 16:25

一、菜单显示

先说CCMenuitem:通常使用这三个类来创建

CCMenuItemImage:图片按钮菜单项,通过指定图片资源来创建菜单项。

CCMenuItemLabel:文本菜按钮单项,通过指定文本标签( 实现CCLabelProtocol接口的类,如CCLabelTTF)来创建菜单项。

CCMenuItemToggle :开关按钮菜单项,这种类型的按钮一次只有一个菜单项显示出来,当你单击它的时候,它就会切换到另外一个菜单项。

1.CCMenuItemImage:可选择三种状态:未选中, 选中, 不可用

    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(s_pPathClose, s_pPathClose, this, menu_selector(TestController::closeCallback) );
    CCMenu* pMenu =CCMenu::create(pCloseItem, NULL);

    TestController::closeCallback是点击菜单后调用的函数。

2、CCMenuItemLabel:

    for (int i = 0; i < TESTS_COUNT; ++i)
    {
        CCLabelTTF* label = CCLabelTTF::create(g_aTestNames[i].c_str(), "Arial", 24);   //这里是赋值菜单文本
        CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestController::menuCallback));
        m_pItemMenu->addChild(pMenuItem, i + 10000);    //m_pItemMenu就是菜单
        pMenuItem->setPosition( ccp( VisibleRect::center().x, (VisibleRect::top().y - (i + 1) * LINE_SPACE) ));
    }

    //设置一下整个菜单的大小

    m_pItemMenu->setContentSize(CCSizeMake(VisibleRect::getVisibleRect().size.width, (TESTS_COUNT + 1) * (LINE_SPACE)));


当然也可以用辅助类CCMenuItemFont来实现,该菜单点击时可产生字体放大

CCMenuItemFont::setFontName("Arial");CCMenuItemFont::setFontSize(22);CCMenuItemFont* pFontMenuItem = CCMenuItemFont::create("font item", this, menu_selector(TestController::menuCallback));

所有支持CCLabelProtocol的节点都可以用来创建CCMenuItemLabel。

CCLabelTTF:同时也是CCSprite的子类,用来渲染文字标签的,可以指定字体,每次设置字符串内容时都需要重新创建纹理和渲染,性能不好,可以用CCLabelBMFont或者CCLabelAtlas代替它。

CCLabelBMFont:也是CCSpriteBatchNode的子类,创建CCLabelBMFont对象需要一个字符串和一个fnt格式的文件(字库),如:

CCLabelBMFont * labelMenu = CCLabelBMFont::create("BitmapFont Atlas", "fonts/bitmapFontTest.fnt");CCMenuItemLabel* pItemBMFon = CCMenuItemLabel::create(labelMenu, this, menu_selector(TestController::menuCallback);pItemBMFon->setPosition(ccp(0, 40));m_MenuView->addChild(pItemBMFon, 10000+10);

CCLabelAtlas:也是CCAtlasNode的子类,创建一个CCLabelAtlas对象的代码如下:

1
2
3
staticCCLabelAtlas * labelWithString(constchar*label,constchar*charMapFile, unsigned intitemWidth, unsigned intitemHeight, unsigned charstartCharMap);
//示例
CCLabelAtlas* label1 = CCLabelAtlas::labelWithString("123 Test","fonts/tuffy_bold_italic-charmap.png", 48, 64, ' ');


参数的含义:要绘制的字符,图片文件,图片文件中每个字符的宽度,图片文件中每个字符的高度,图片的起始字符。

CCLabelAtlas的绘制效率高,但是限制性太多,没有CCLabelBMFont灵活。


3、CCMenuItemToggle:

CCMenuItemImage* toggleNormal = CCMenuItemImage::create(s_pPathClose, s_pPathClose); // 未点击时的图片  
CCMenuItemImage* toggleSelect = CCMenuItemImage::create(s_pPathClose, s_pPathClose); // 点击后的图片  
CCMenuItemToggle* pCloseItem = CCMenuItemToggle::createWithTarget(this, menu_selector(TestController::closeCallback),
toggleNormal, toggleSelect, NULL);// 使用以上两个图片菜单创建一个开关菜单

setSelectedIndex(1);  //ccmenuitem可用来设置状态, 数字代表状态




例子:

void MenuLayer::onEnter(){    CCLayer::onEnter();    CCSize winSize = CCDirector::sharedDirector()->getWinSize();     /**---CCMenuItemLabel:由指定的字符串标签创建菜单--**/    //CCMenuItemFont:内部使用CCLabelTTF    CCMenuItemFont::setFontName("Arial");    CCMenuItemFont::setFontSize(22);    CCMenuItemFont* pFontMenuItem = CCMenuItemFont::itemFromString("font item", this, menu_selector(MenuLayer::menuCallback));    CCMenu* pFontMenu = CCMenu::menuWithItems(pFontMenuItem,NULL);    pFontMenu->setPosition( ccp(winSize.width/2,winSize.height - 30) );    this->addChild(pFontMenu);     //CCMenuItemAtlasFont:内部使用CCLabelAtlas    CCMenuItemAtlasFont* pAtlasFontMenuItem = CCMenuItemAtlasFont::itemFromString("123456789", s_imgPathNum, 15, 19, '0', this, menu_selector(MenuLayer::menuCallback));    CCMenu* pAtlasFontMenu = CCMenu::menuWithItems(pAtlasFontMenuItem,NULL);    pAtlasFontMenu->setPosition( ccp(winSize.width/2,winSize.height - 60) );    this->addChild(pAtlasFontMenu);     //CCLabelBMFont    CCLabelBMFont* pBMFontLabel = CCLabelBMFont::labelWithString("configuration", s_imgPathBMFont);    CCMenuItemLabel* pItemBMFontLabel = CCMenuItemLabel::itemWithLabel(pBMFontLabel, this, menu_selector(MenuLayer::menuCallback));    CCMenu* pBMFontMenu = CCMenu::menuWithItems(pItemBMFontLabel,NULL);    pBMFontMenu->setPosition( ccp(winSize.width/2,winSize.height - 90) );    this->addChild(pBMFontMenu);     /**--CCMenuItemSprite:由指定的精灵类创建菜单--**/    CCSprite* spriteNormal = CCSprite::spriteWithFile(s_imgPathMenuItem, CCRectMake(0,23*2,115,23));    CCSprite* spriteSelected = CCSprite::spriteWithFile(s_imgPathMenuItem, CCRectMake(0,23*1,115,23));    CCSprite* spriteDisabled = CCSprite::spriteWithFile(s_imgPathMenuItem, CCRectMake(0,23*0,115,23));    CCMenuItemSprite* pMenuItemSprite = CCMenuItemSprite::itemFromNormalSprite(spriteNormal, spriteSelected, spriteDisabled, this, menu_selector(MenuLayer::menuCallback));    CCMenu* pSpriteMenu = CCMenu::menuWithItems(pMenuItemSprite,NULL);    pSpriteMenu->setPosition( ccp(winSize.width/2,winSize.height - 120) );    this->addChild(pSpriteMenu);     //CCMenuItemImage:由指定的图片文件名创建菜单    CCMenuItemImage* pMenuItemImage = CCMenuItemImage::itemFromNormalImage(s_imgPathCloseNormal, s_imgPathCloseSelected, this, menu_selector(MenuLayer::menuCallback) );    CCMenu* pImageMenu = CCMenu::menuWithItem(pMenuItemImage);    pImageMenu->setPosition( ccp(winSize.width/2,winSize.height - 150) );    this->addChild(pImageMenu);     //CCMenuItemToggle:开关菜单,切换效果    //这里只使用了CCMenuItemFont,还可以使用其他的CCMenuItem    CCMenuItemToggle* pMenuItemToggle = CCMenuItemToggle::itemWithTarget(this, menu_selector(MenuLayer::menuCallback),                                                               CCMenuItemFont::itemFromString( "On" ),                                                              CCMenuItemFont::itemFromString( "Off"),                                                              NULL );    CCMenu* pToggleMenu = CCMenu::menuWithItems(pMenuItemToggle,NULL);    pToggleMenu->setPosition( ccp(winSize.width/2,winSize.height - 180) );    this->addChild(pToggleMenu);}运行效果如下:

</pre><h1>二、点击处理</h1><div><span style="white-space:pre"></span>实例:</div><div><span style="white-space:pre"></span>1、生成菜单:</div><div><span style="white-space:pre"><span style="white-space:pre"></span></span><pre name="code" class="cpp">for(BYTE i = 0; i < 4; i++){CCLabelBMFont * labelMenu = CCLabelBMFont::create(m_MenuName[i].c_str(), "fonts/bitmapFontTest.fnt");CC_BREAK_IF(! labelMenu);CCMenuItemLabel* pItemBMFon = CCMenuItemLabel::create(labelMenu, this, menu_selector(TestController::menuCallback));CC_BREAK_IF(! pItemBMFon);pItemBMFon->setPosition(ccp(0, 100 - i*40));m_MenuView->addChild(pItemBMFon, 10000+i);}
2、处理:
void TestController::menuCallback(CCObject *object){CCMenuItem *menuitem = (CCMenuItem*)object;int nIdx = menuitem->getZOrder() - 10000;
<span style="white-space:pre"></span>switch (nIdx)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>case 0:<span style="white-space:pre"></span>break;<span style="white-space:pre"></span>case 1:<span style="white-space:pre"></span>break;<span style="white-space:pre"></span>case 2:<span style="white-space:pre"></span>break;<span style="white-space:pre"></span>case 3:<span style="white-space:pre"></span>CCDirector::sharedDirector()->end();<span style="white-space:pre"></span>break;<span style="white-space:pre"></span>}
}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 武汉社保卡掉了怎么办 职工社保卡丢了怎么办 杭州社保卡丢了怎么办 农村医疗卡丢了怎么办 陕西省医保卡丢了怎么办 小孩社保卡掉了怎么办 社区医保本丢了怎么办 宝宝医保卡掉了怎么办 同煤医疗卡丢了怎么办 杭州医保卡丢了怎么办 新的医保卡丢了怎么办 二代医保卡丢了怎么办 老医保卡丢了怎么办 上海医保卡余额用完了怎么办 身份证丢了医疗报销怎么办 取公积金身份证丢了怎么办 身份证丢了怎么办就诊卡 人在外地怎么办农村社保卡 武汉医保卡丢了怎么办 济宁社保卡丢了怎么办 农村医疗本丢了怎么办 常熟医保卡丢了怎么办 农民社保卡丢了怎么办 常熟社保卡坏了怎么办 社保卡丢失补办期看病怎么办 社保卡补办期间看病怎么办 医保卡冻结了出院结算怎么办 住院医保卡钱不够怎么办 住院押金条丢了怎么办 急用新社保卡要怎么办 看病没带社保卡怎么办 医保卡掉了住院怎么办 厦门医保卡丢了怎么办 成都医保卡丢了怎么办 长春医保卡丢了怎么办 县城医保卡丢了怎么办 医保卡丢了怎么办南宁 西安职工医保丢了怎么办 重庆医保卡丢了怎么办 外地医保卡丢了怎么办 换单位后医保卡怎么办