一、菜单显示
先说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,
' '
);
|
参数的含义:要绘制的字符,图片文件,图片文件中每个字符的宽度,图片文件中每个字符的高度,图片的起始字符。
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);
}
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>}
}