Cocos2dx2.2.1中单选按钮的实现

前端之家收集整理的这篇文章主要介绍了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],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_tempint ring
这两个变量的作用是

@H_404_74@
  • 初始化界面的时候,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);
    }

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

    猜你在找的Cocos2d-x相关文章