最近做自己的塔防游戏的时候用到的,作为记录记载下来。
MenuItemToggle可以实现按钮的开关两种状态,类似”ON”->”OFF”.
void@H_404_7@ SettingScene::addMenuItems(){
auto@H_404_7@ size=Director::getInstance()->getWinSize();
/*添加返回按钮*/@H_404_7@
auto@H_404_7@ backMenuItem=MenuItemImage::create(
"SettingSceneImages/backMenuItem_1.png"@H_404_7@,"SettingSceneImages/backMenuItem_2.png"@H_404_7@,CC_CALLBACK_1(SettingScene::menuBackCallback,this@H_404_7@));
backMenuItem->setPosition(Point(size.width-backMenuItem->getContentSize().width/2@H_404_7@,backMenuItem->getContentSize().height/2@H_404_7@));
this@H_404_7@->addChild(backMenuItem,1@H_404_7@);
auto@H_404_7@ startWidth=backMenuItem->getContentSize().width+80@H_404_7@; //起始横坐标(左上方第一个) @H_404_7@
auto@H_404_7@ startHeight=size.height-backMenuItem->getContentSize().height/2@H_404_7@-20@H_404_7@; //起始纵坐标@H_404_7@
/*添加"打开\关闭音乐"按钮*/@H_404_7@
_openMusicItem=MenuItemImage::create(
"SettingSceneImages/openMusicItem_1.png"@H_404_7@,"SettingSceneImages/openMusicItem_2.png"@H_404_7@
);
_closeMusicItem=MenuItemImage::create(
"SettingSceneImages/closeMusicItem_1.png"@H_404_7@,"SettingSceneImages/closeMusicItem_2.png"@H_404_7@);
//组合按钮@H_404_7@
auto@H_404_7@ setMusicMenuToggle=MenuItemToggle::createWithCallback(CC_CALLBACK_1(SettingScene::menuSetMusicCallback,this@H_404_7@),_openMusicItem,_closeMusicItem,NULL);
setMusicMenuToggle->setPosition(Point(startWidth,startHeight));
/*添加“打开|关闭音效”按钮*/@H_404_7@
_openEffectItem=MenuItemImage::create(
"SettingSceneImages/openEffectItem_1.png"@H_404_7@,"SettingSceneImages/openEffectItem_2.png"@H_404_7@);
_closeEffectItem=MenuItemImage::create(
"SettingSceneImages/openEffectItem_1.png"@H_404_7@,"SettingSceneImages/openEffectItem_2.png"@H_404_7@);
//组合按钮@H_404_7@
auto@H_404_7@ setEffectMenuToggle=MenuItemToggle::createWithCallback(CC_CALLBACK_1(SettingScene::menuSetEffectCallback,_openEffectItem,_closeEffectItem,NULL);
setEffectMenuToggle->setPosition(Point(300@H_404_7@,400@H_404_7@));
/*添加“打开|关闭血条”按钮*/@H_404_7@
_openHpBarItem=MenuItemImage::create(
"SettingSceneImages/openHpBarItem_1.png"@H_404_7@,"SettingSceneImages/openHpBarItem_2.png"@H_404_7@);
_closeHpBarItem=MenuItemImage::create(
"SettingSceneImages/openHpBarItem_1.png"@H_404_7@,"SettingSceneImages/openHpBarItem_2.png"@H_404_7@);
//组合按钮@H_404_7@
auto@H_404_7@ setHpBarMenuToggle=MenuItemToggle::createWithCallback(CC_CALLBACK_1(SettingScene::menuSetHpBarCallback,_openHpBarItem,_closeHpBarItem,NULL);
setHpBarMenuToggle->setPosition(Point(0@H_404_7@,0@H_404_7@));
//总菜单@H_404_7@
auto@H_404_7@ menu=Menu::create(setMusicMenuToggle,setEffectMenuToggle,setHpBarMenuToggle,NULL);
menu->setPosition(Point(0@H_404_7@,0@H_404_7@));
this@H_404_7@->addChild(menu,1@H_404_7@);
}
首先, 创建两个 MenuItemImage,然后把他们都添加到了 MenuItemToggle 里面。这个类会管理当前应该显示的菜单项,同时会在开关元素之间进行一些切换。
注意,当创建 MenuItemImage 的时候,最好不设置回调函数(也可以把回调函数设置成了NULL),而是为 MenuItemToggle 类设置了回调函数。这样当 MenuItemImage 在 MenuItemToggle 中的时候,在 MenuItemImage 上的任何 selector 都不会被调用,而只有 MenuItemToggle的selector会被调用。当然,我们可以很容易地在回调函数里面区分,到底哪个菜单项是可见的。
也就是在MenuItemToggle这一层抽象层上,编写回调函数的时候不需要考虑下一层的具体,而是只是完成它的回调函数。
特别注意,坐标设置
我们在创建MenuItemImage项的时候不用设置坐标,而是指定MenuItemToggle的坐标。然后把Toggle添加到Menu里,这里有一个设置坐标的细节。 为了设置坐标方便,一般把Menu坐标设置为Point::ZERO,这样在向Menu添加菜单项的时候菜单项(MenuItemxxx)就可以直接写相对于实际屏幕的坐标了.