Cocos2dx2.2.1中单选按钮的实现
背景
最近做一个学长给的任务,里面需要单选按钮的控件。不知道是我没好好找还是什么原因,cocos2dx中好像没有提供(我总是觉得它应该有这类简单控件)。
想法
单选按钮组成:
两个CCMenuItemToggle类型的按钮作为单选按钮的基本组成(至少两个按钮才能称为‘单选’吧)
实现
/*checked 是用来设置图片的顺序,即被选中和没有被选中状态的图片 s_bnRing_normal[index]和s_bnRing_selected[index] 是我zai Resourse.h资源文件中定义的char* 数组,里面保存了normal和selected状态的按钮图片,方便批量生成多个toggle*/
CCMenu* ClockSetting :: toggleMenuCreate_ring(int index,int isChecked)
{
CCMenu* toggleMenu = CCMenu::create();
CCMenuItemImage* onItemMenu = CCMenuItemImage::create(s_bnRing_selected[index],s_bnRing_selected[index],this,menu_selector(ClockSetting::menuCallBack_ring_items));
//onItemMenu->setOpacity(170);
CCMenuItemImage* offItemMenu = CCMenuItemImage::create(s_bnRing_normal[index],s_bnRing_normal[index],menu_selector(ClockSetting::menuCallBack_ring_items));
//offItemMenu->setOpacity(170);
CCMenuItemToggle *toggleItem;
if(isChecked == 1)
toggleItem = CCMenuItemToggle::createWithTarget(this,menu_selector(ClockSetting::menuCallBack_ring_items),onItemMenu,offItemMenu,NULL);
else
toggleItem = CCMenuItemToggle::createWithTarget(this,NULL);
toggleItem->setScale(1.5f);
toggleItem->setAnchorPoint(ccp(0.5f,1.0f));
toggleMenu->addChild(toggleItem,0,index);
//这里设置tag对单选功能实现是必须的
toggleMenu->setTag(index);
return toggleMenu;
}
在成员变量中我定义了
int ring_temp
和int ring
这两个变量的作用是
- 初始化界面的时候,ring来保存从存储数据文件中获取的,这个单选按钮控制的功能(例如一个闹钟,ring = 0代表静音,ring=1代表震动)。ring_temp是用来在来回选择toggle时记录所选功能的。
- 在退出功能设置界面时,用户有两个选项,一是保存所更改的设置(这时候需要保存的是ring_temp),二是不保存退出(这时候保存的是ring,因为ring除了被初始化的时候不能被改变)。
-
接下来是实现单选的逻辑
void ClockSetting::menuCallBack_ring_items(CCObject* pSender)
{
do
{
//这里的前两行是用tag获取toggle按钮的父节点的,生成好的toggle需要放到它的父节点中显示
CCSprite* background = (CCSprite*)getChildByTag(tag_ring_popuplayer_background);
CCSprite* rect = (CCSprite*)background->getChildByTag(tag_ring_popuplayer_rect);
CCMenu* items = (CCMenu*)pSender;
CCMenu* toggle[2];
CCSize whitRectBackgroundSize = rect->getContentSize();
float hight = whitRectBackgroundSize.height/8;
//获取用户点击是哪个按钮
lastRing = ring_temp;
//如果相等,则表示是在重复点击同一个按钮
if(lastRing == items->getTag())
{
if(lastRing == 0)
{
//去除被点击的按钮
rect->removeChildByTag(tag_ring_popuplayer_toggle_1);
//用于toggle的特性就是点一次换一次图片,所以要保证按钮状态不变,需要重新生成
toggle[0] = toggleMenuCreate_ring(0,1);
toggle[0]->setTag(0);
toggle[0]->setAnchorPoint(ccp(0.0f,0.5f));
//这里是位置的设置,具体情况具体设置
toggle[0]->setPosition(ccp(whitRectBackgroundSize.width/3-40,hight*6-4));
rect->addChild(toggle[0],tag_ring_popuplayer_toggle_1);
}
else
{
rect->removeChildByTag(tag_ring_popuplayer_toggle_2);
toggle[1] = toggleMenuCreate_ring(1,1);
toggle[1]->setTag(1);
toggle[1]->setAnchorPoint(ccp(0.0f,0.5f));
//这里是位置的设置,具体情况具体设置
toggle[1]->setPosition(ccp(whitRectBackgroundSize.width/3-40,hight*4-4));
rect->addChild(toggle[0],tag_ring_popuplayer_toggle_2);
}
//跳出do-while
break;
}
CCLOG("menuCallBack_ring_items");
//和上一次点击的按钮不是同一个,保存这次点击的tag
lastRing = items->getTag();
//全部移除
rect->removeChildByTag(tag_ring_popuplayer_toggle_1);
rect->removeChildByTag(tag_ring_popuplayer_toggle_2);
CCMenu* t2 = (CCMenu*)rect->getChildByTag(tag_ring_popuplayer_toggle_2);
if(ring_temp == 1)
{
//改变ring_temp所代表的标示,标示用户选择了新的功能
ring_temp =0;
toggle[0] = toggleMenuCreate_ring(0,1);
toggle[1] = toggleMenuCreate_ring(1,0);
CCSize toggleSize = toggle[0]->getContentSize();
for(int i=0;i<2;i++)
{
toggle[i]->setTag(i);
toggle[i]->setAnchorPoint(ccp(0.0f,0.5f));
//这里是位置的设置,具体情况具体设置
toggle[i]->setPosition(ccp(whitRectBackgroundSize.width/3-40,hight*(6-2*i)-4));
}
rect->addChild(toggle[0],tag_ring_popuplayer_toggle_1);
rect->addChild(toggle[1],tag_ring_popuplayer_toggle_2);
}
else
{
//gee
ring_temp =1;
CCMenu* toggle[2];
toggle[0] = toggleMenuCreate_ring(0,0);
toggle[1] = toggleMenuCreate_ring(1,1);
CCSize toggleSize = toggle[0]->getContentSize();
for(int i=0;i<2;i++)
{
// toggle[i]->setTag(i);
toggle[i]->setAnchorPoint(ccp(0.0f,0.5f));
toggle[i]->setPosition(ccp(whitRectBackgroundSize.width/3-40,tag_ring_popuplayer_toggle_2);
}
}while(0);
}