如何进行多个按钮之间来进行切换

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();

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值