在使用Mneu的时候,我们通常会使用MenuItem来创建Menu,而MenuItem的子类有很多,如下图:
我们经常会使用到的就是MenuItemImage和MenuItemSprite,在这里,就讲讲MenuItemToggle的用处和用法。
MeniItemToggle:它在内部拥有一个MenuItem数组,用来负责展示不同的按钮状态。因为使用了一个菜单按钮的数组,所以此类的对象可以实现状态切换。
//通过容器来创建一个MenuItemToggle
static MenuItemToggle * createWithCallback(const ccMenuCallback& callback, constVector<MenuItem*>& menuItems);
//通过一系列MenuItem来创建一个MenuItemToggle,最后要以NULL结尾
static MenuItemToggle* createWithCallback(const ccMenuCallback& callback, MenuItem*item, ...) CC_REQUIRES_NULL_TERMINATION;
MenuItemToggle实现了显示内容的切换,所切换之后显示的内容由你在创建时所添加的MenuItem的内容和顺序有关,默认显示第一个MenuItem。既然MenuItemToggle能够显示内容的切换,那么我们可以用它来实现单选按钮或者多选按钮之类的功能,点击显示选中状态,再次点击显示未选中状态。
在有些游戏的设置界面中,就有点击切换选中与没选中状态来实现是否开启或关闭音乐的功能,那么这个控件就可以通过MenuItemToggle来实现,如下图:
下面我们来实现这种控件:
首先创建MenuItemToggle,然后通过其创建Menu
//选中状态精灵
auto musicOnSpr=Sprite::createWithSpriteFrameName("Hook.png");
//未选中状态精灵
auto musicOffSpr=Sprite::createWithSpriteFrameName("unchecked.png");
//将精灵包装成MenuItem,以便创建MenuItemToggle
auto musicOn=MenuItemSprite::create(musicOnSpr, musicOnSpr);
auto musicOff=MenuItemSprite::create(musicOffSpr, musicOffSpr);
//创建MenuItemToggle,第一个参数是回调函数 后面依次是要显示的MenuItem,最后必须为NULL
MenuItemToggle* musicItemToggle=MenuItemToggle::createWithCallback(CC_CALLBACK_1(SetLayer::menuCallBack, this), musicOn,musicOff, NULL);
//通过MenuItemToggle创建Menu
auto menu=Menu::create(musicItemToggle,NULL);
menu->setPosition(Vec2(0, 0));
this->addChild(menu);
我们再来看看回调函数void SetLayer::menuCallBack(Ref* ref)
参数Ref表示被点击的MenuItem
void SetLayer::menuCallBack(Ref* ref)
{
//将ref转换为MenuItemToggle对象
auto item=(MenuItemToggle*)ref;
/*获取当前显示内容的下标,可以通过下标知道当前控件所显示的内容,在创建MenuItemToggle时,第一个被添加到MenuItemToggle的MenuItem的下标为0,第二个被添加到MenuItemToggle的MenuItem的下标为1,以此类推,在这里,显示musicOn时,getSelectedIndex的值为0,显示musicOff时,getSelectedIndex的值为1*/
item->getSelectedIndex();
//再根据显示内容实现不同操作
........
}