1、创建一个MenuItem类型的Vector集合,把所有的按钮加入集合中,并且这个集合添加Menu中;
Vector<MenuItem*> _SelectMenuArray;
int selectIndex = 0;//默认选择第一个;
for (int i = 0; i < 4; i++){
auto menuItem = MenuItemSprite::create(NULL, CC_CALLBACK_1(HelloWorld::menuCallBack, this));
menuItem->setPosition(Vec2(294.f + 124.f*i, 598.f));
menuItem->setTag(i);
if (i == selectIndex)
{
menuItem->setEnabled(false);
menuItem->selected();
}
auto menuName = Label::create("", FONT_APP, 20);
LABEL_SETSTR(menuName, selectName[i].c_str());
menuName->setColor(Color3B(162, 73, 0));
menuName->setPosition(Vec2(60, 25));
menuItem->addChild(menuName);
_SelectMenuArray.pushBack(menuItem);
}
auto SelectMenu = Menu::createWithArray(_SelectMenuArray);
SelectMenu->setPosition(Vec2::ZERO);
this->addChild(SelectMenu, 2);
第二种:
Vector<MenuItem*> _menuVec;
MenuItemSprite* menuitem[6] = { NULL };
std::string labelstring[6] = { "KEY_CPHELP_TITLE0", "KEY_CPHELP_TITLE1", "KEY_CPHELP_TITLE2", "KEY_CPHELP_TITLE3", "KEY_CPHELP_TITLE4", "KEY_CPHELP_TITLE5" };
CpRuleTag tag[6] = {
Help_ShuXin,
Help_PeiYang,
Help_ZhuangBei,
Help_MingRen,
Help_GuanQia
};
_menuVec.clear();
for (int i = 0; i < 5; i++)
{
auto normal = ui::Scale9Sprite::createWithSpriteFrameName("Blue_Btn_Normal.png");
normal->setContentSize(Size(150.f, 60.f));
auto press = ui::Scale9Sprite::createWithSpriteFrameName(("Yellow_Btn_Normal.png"));
press->setContentSize(Size(150.f, 60.f));
menuitem[i] = MenuItemSprite::create(normal, press, NULL, CC_CALLBACK_1(CpGameHelp::menuCallBack, this));
if (i % 2 == 0)
menuitem[i]->setPositionX(120.f);
else
menuitem[i]->setPositionX(280.f);
menuitem[i]->setPositionY(400.f - (int)(i / 2) * 80);
Label* label = Label::create("", FONT_APP, 22);
label->enableShadow(Color4B(0, 0, 0, 128), Size(1, -1));
label->setMaxLineWidth(140);
label->setAlignment(TextHAlignment::CENTER, TextVAlignment::CENTER);
LABEL_SETSTR(label, labelstring[i].c_str());
label->setPosition(Vec2(75.f, 30.f));
menuitem[i]->addChild(label);
menuitem[i]->setTag(tag[i]);
_menuVec.pushBack(menuitem[i]);
}
menuitem[0]->setEnabled(false);
menuitem[0]->selected();
m_Menu = Menu::createWithArray(_menuVec);
m_Menu->setPosition(Vec2(-RELATIVEPOSX / 2, 0));
this->addChild(m_Menu);
2、根据获得tag来进行相对应的操作,点击的按钮和其他按钮状态需要改变(是否可以点击、是否被选中)
void HelloWorld::menuCallBack(Ref* ref)
{
MenuItemSprite* menuItem = (MenuItemSprite*)ref;//也可以用MenuItem* menuItem = (MenuItem*)ref;
//Menu* parent = (Menu*)menuItem->getParent();//Vector<Node*> menuItemArray = parent->getChildren();才会用到它
switch (menuItem->getTag())
{
case 0: {//头饰;
}break;
case 1: {//衣服;
}break;
case 2: {//手饰;
}break;
case 3: {//鞋子;
}break;
default:
break;
}
//点击的按钮被选择且不可点击;
menuItem->setEnabled(false);
menuItem->selected();
//第一种可以用定义_SelectMenuArray的类全局变量 或者Vector<Node*> menuItemArray = parent->getChildren();//获得全部按钮
for (Vector<Node*>::iterator itor = menuItemArray.begin(); itor != menuItemArray.end(); itor++)//四个按钮处理是否可以点击;
{
MenuItemSprite* menuItemSp = dynamic_cast<MenuItemSprite*>(*itor);
if (menuItemSp != nullptr)
{
if (menuItemSp->getTag() != menuItem->getTag())
{
menuItemSp->setEnabled(true);
menuItemSp->unselected();
}
}
}
//第二种 可以用定义_SelectMenuArray的类全局变量或者Vector<Node*> menuItemArray = parent->getChildren();
for (int i = 0; i < (int)_SelectMenuArray.size(); i++)
{
if (menuItem != _SelectMenuArray.at(i))
{
_SelectMenuArray.at(i)->setEnabled(true);
_SelectMenuArray.at(i)->unselected();
}
}
//第三种:可以定义_SelectMenuArray的类全局变量或者Vector<Node*> menuItemArray = parent->getChildren();//获得全部按钮
int selectTag = menuItemSp->getTag() ;
for (auto & p : _SelectMenuArray) {
if (p->getTag() != selectTag) {
if (!p->isEnabled()) {
p->unselected();
p->setEnabled(true);
}
}
}
}
第四种:
void CpGameHelp::menuCallBack(Ref* ref)
{
PLAY_EFFECT("Sound.bundle/Bt_Press.mp3");
MenuItem* item0 = (MenuItem*)ref;
_helpId = item0->getTag();
for (int i = 0; i < (int)_menuVec.size(); i++)
{
if (item0 == _menuVec.at(i))
{
_menuVec.at(i)->setEnabled(false);
_menuVec.at(i)->selected();
}
else
{
_menuVec.at(i)->setEnabled(true);
_menuVec.at(i)->unselected();
}
}
}