Cocos2dx2.2.1中单选按钮的实现

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],this,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,menu_selector(ClockSetting::menuCallBack_ring_items),offItemMenu,onItemMenu,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_tempint 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],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],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],0,tag_ring_popuplayer_toggle_1);
            rect->addChild(toggle[1],0,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,hight*(6-2*i)-4));
            }
            rect->addChild(toggle[0],0,tag_ring_popuplayer_toggle_1);
            rect->addChild(toggle[1],0,tag_ring_popuplayer_toggle_2);
        }
    }while(0);
}

基本就是这样。
这篇博客是我去年学cocos2dx做一个小应用的时候写的,原文在这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值