菜单制作,事件处理

一、菜单显示

先说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
static CCLabelAtlas * labelWithString( const char *label, const char *charMapFile, unsigned int itemWidth, unsigned int itemHeight, unsigned char startCharMap);
//示例
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值