开关菜单的菜单项类是MenuItemToggle,它是一种可以进行两种状态切换的的菜单项,其创建函数如下:
static MenuItemToggle *createWithCallback(
const ccMenuCallback &callback, //菜单操作的回调函数指针
MenuItem *utem, //进行切换的菜单项
...
)
由上可见该创建函数有着不定参数,且从第二个参数开始就是MenuItem类的实例对象,即开关菜单显示的菜单项,可以为文本,图片或精灵类型的菜单项。
先通过文本创建一个简单的开关菜单
MenuItemToggle *toggleMenuItem = MenuItemToggle ::createWithCallback(CC_CALLBACK_0(HelloWorld::menuItemCallback,this),
MenuItemFont::create("On"),
MenuItemFont::create("Off"),
NULL);
Menu *menu = Menu::create(toggleMenuItem ,NULL);
this->addChild(menu);
//回调函数
void HellWorld::menuItemCall()
{
//实现回调内容
}
这样一个简单的开关菜单就设计好了,下面看一个稍微复杂的例子,做一个游戏音量、音效设置页面
bool HelloWorld::init()
{
if(!Layer::init())
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
Sprite *bg = Sprite::create("background.png");
bg->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.hight/2));
this->addChild(bg);
//音效
MenuItemImage *soundOnImage = MenuItemImage::create(
"on.png","on.png");
MenuItemImage *soundOffImage = MenuItemImage::create(
"off.png","off.png");
MenuItemToggle *soundToggleMenuItem = MenuItemToggle
::createWithCallback(CC_CALLBACK_0(HelloWorld::
menuSoundCallback,this),
soundOnImage ,
soundOffImage,
NULL);
soundToggleMenuItem->setPosition(Director::getInstance()->convertToGL(800,200));
//音乐
MenuItemImage *musicOnImage = MenuItemImage::create(
"on.png","on.png");
MenuItemImage *musicOffImage = MenuItemImage::create(
"off.png","off.png");
MenuItemToggle *musicToggleMenuItem = MenuItemToggle
::createWithCallback(CC_CALLBACK_0(HelloWorld::
menuMusicCallback,this),
musicOnImage ,
musicOffImage,
NULL);
musicToggleMenuItem->setPosition(Director::getInstance()->convertToGL(600,150));
//创建OK按钮
auto okMenuItem = MenuItemImage::create(
"down.png",
"up.png",
CC_CALLBACK_0(HelloWorld::
menuOKCallback,this));
okMenuItem->setPosition(Director::getInstance()->convertToGL(300,550));
Menu *menu = Menu::create(soundToggleMenuItem,musicToggleMenuItem,okMenuItem,NULL);
this->addChild(menu);
return true;
}