在前两篇文章中,我们介绍了在注册场景中需要用到的输入框及弹出框的实现方式,这两篇文章中介绍的内容在登录场景同样会用到。而我们经常会在登录场景中见到的另一种元素就是自动登录或者记住密码的Checkbox选择框。那么,接下来就让我们看看这个选择框如何实现。

首先,我们先看一下效果

我们需要的就是一个Checkbox选择框,后面加上“自动登录”或者其他的文字。效果就是点击选择框或文字时,Checkbox的状态会进行切换;同时在程序中还要知道当前选择框的状态,只要我们能够实现这几点,这个功能就完成了。

界面问题比较简单,我们只需要根据自己的图片素材和要展示的文字来摆放各元素的位置就可以了,我们可以把Checkbox和文字放到一个父元素中,然后再整体调整其位置。

至于切换效果,我们可以将两种效果图叠放到一起,然后通过设置元素是否可见来实现。而当前状态也可以根据元素是否可见来确定。现在,上面的几个问题都解决了。下面然我们来看一看实现代码。

CCCheckbox.h文件

 #ifndef __MyGame__CCCheckbox__
#define __MyGame__CCCheckbox__ #include "cocos2d.h"
using namespace cocos2d; class CCCheckbox:public CCSprite{
public:
//创建checkbox
static CCSprite * create(const char * picNoSelect,const char * picSelect,const char * content ,int status = ); //点击操作
int click(); private:
//获取当前状态
int getStatus();
}; #endif /* defined(__MyGame__CCCheckbox__) */

CCCheckbox.cpp文件

 #include "CCCheckbox.h"
#include "cocos2d.h" using namespace cocos2d; //创建,参数:未选中图片名,选中图片名,文字,状态(0-未选中,1-选中)
CCSprite * CCCheckbox::create(const char * picNoSelect, const char * picSelect, const char * content, int status)
{
CCSprite * sp = CCSprite::create(); //checkbox
CCSprite * sp_checkbox_select = CCSprite::create(picSelect);
CCSprite * sp_checkbox_noSelect = CCSprite::create(picNoSelect);
CCSize size_checkbox = sp_checkbox_noSelect->getContentSize(); //文字
CCLabelTTF * label_content = CCLabelTTF::create(content, "Arial", );
label_content->setColor(ccBLACK);
label_content->setHorizontalAlignment(kCCTextAlignmentLeft); //左对齐
CCSize size_content = label_content->getContentSize(); //缩放比例
float scale_h = size_checkbox.height / size_content.height; //缩放文字
label_content->cocos2d::CCNode::setScale(scale_h, scale_h); //最终大小
CCSize size = CCSize(size_checkbox.width * + size_content.width * scale_h , size_checkbox.height * 1.5);
sp->setContentSize(size); //设置checkbox状态
sp->addChild(sp_checkbox_noSelect);
sp->addChild(sp_checkbox_select);
sp_checkbox_noSelect->setPosition(CCPointMake(size_checkbox.width,size.height/));
sp_checkbox_select->setPosition(CCPointMake(size_checkbox.width,size.height/));
sp_checkbox_noSelect->setTag(); //不选中tag=0
sp_checkbox_select->setTag(); //选中tag=1 if (status == )
{
//设置未选中状态
sp_checkbox_noSelect->setVisible(true);
sp_checkbox_select->setVisible(false);
}
else
{
//设置选中状态
sp_checkbox_noSelect->setVisible(false);
sp_checkbox_select->setVisible(true);
} //设置文字位置
sp->addChild(label_content);
label_content->setAnchorPoint(CCPoint(,0.5));
label_content->setPosition(CCPointMake(size_checkbox.width * , size.height/)); return sp;
} //点击操作
int CCCheckbox::click()
{
int status = getStatus();
CCSprite * sp_checkbox_noSelect = (CCSprite *)(this->getChildByTag());
CCSprite * sp_checkbox_select = (CCSprite *)(this->getChildByTag()); if (status == )
{
status = ;//状态设置为选中
sp_checkbox_noSelect->setVisible(false);
sp_checkbox_select->setVisible(true);
}
else
{
status = ;//状态设置为未选中
sp_checkbox_noSelect->setVisible(true);
sp_checkbox_select->setVisible(false);
} return status;
} //获取当前状态,0-未选中,1-选中
int CCCheckbox::getStatus()
{
CCSprite * sp_checkbox_noSelect = (CCSprite *)(this->getChildByTag());
int status = ; //未选中
if (!sp_checkbox_noSelect->isVisible())
{
status = ;//选中
} return status;
}

下面是登录场景中使用Checkbox的代码

 //自动登录
CCSprite * spriteAuto = CCCheckbox::create("checkbox_normal.png", "checkbox_select.png", "自动登录", );
CCMenuItemSprite * itemAuto = CCMenuItemSprite::create(spriteAuto, spriteAuto,this,menu_selector(LoginHandleLayer::clickCheckbox));

我们将Checkbox放到Menu中来触发其点击事件,相应的回调函数为

 //点击checkbox
void LoginHandleLayer::clickCheckbox(CCObject * pSender)
{
CCLog("clickCheckbox"); CCMenuItemSprite * item = (CCMenuItemSprite *)pSender;
CCCheckbox * checkbox = (CCCheckbox *)(item->getNormalImage());
int status = checkbox->click(); CCLog("status:%d",status);
}

现在我们点击切换Checkbox时,可以看到输出的日志,正确得到了Checkbox的当前选择状态。

现在,我们就成功实现了选择框的状态切换功能。

cocos2dx2.2.2登录场景中Checkbox选择框的实现的更多相关文章

  1. 转:zTree树控件入门之checkbox:如何动态设置节点的checkbox选择框启用与禁用状态(chkDisabled)

    当一棵树的部分节点根据登入用户角色不同而决定是否启用节点前的checkbox选择框的时候,我们应该如何做呢?也或者如何在页面加载的时候动态根据当前登入用户角色动态切换节点前的checkbox的禁用状态 ...

  2. 用jquery修改默认的单选框radio或者复选框checkbox选择框样式

    默认的radio和checkbox选框很难看.我去看了一下qq注册的页面.发现单选和复选框并没有用<input>,居然是用是A标签.然后用css背景图片展示选择框,用JavaScript控 ...

  3. table中checkbox选择多行

    页面代码 <table id="addressTable" class="ui-jqgrid-htable ui-common-table table table- ...

  4. JQuery中Checkbox选择

    判断是否选中 $(this).is(":checked") 取消选中 $(this).prop("checked", false) 选中 $(this).pro ...

  5. 如何在vue+element中实现选择框和穿梭框的根据拼音以及拼音首字母以及汉字的模糊搜索

    1.汉字: 直接添加对应的 filterable     2.拼音: 穿梭框和选择器的实现方式有所不同   选择器:   <1>下载pinyin-match:   npm i --save ...

  6. bootstrap-treeview 关于checkbox选择框不显示的问题

    bootstrap-treeview.js  1.0.2 不支持checkbox,最后使用 bootstrap-treeview.js  1.2.0 解决此问题.

  7. checkbox选择框如果被选中value值就可以传过去,没有被选中value就不能穿过去(调试了近一天,坑爹的说)

    因为要适合各种分辨率,所以将原来的单选按钮radio换成单个的checkbox

  8. 左右选择框 js插件

    随着项目的进展,测试工程师在更多的浏览器中兼容性测试中,发现有些浏览器不支持option的触发事件,这就造成了先前一篇博文bootstrap 左右框多项选择示例 中左右选择框的失效,于是我就由原先的s ...

  9. [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 在<仙剑奇侠传>.<古剑奇谭>等游戏中,常常须要玩家在一个3D场景中 ...

随机推荐

  1. CodeForces 164C Machine Programming 费用流

    Machine Programming 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co One remark ...

  2. ubuntu完美卸载JDK

    要删除 OpenJDK (如果已安装的话).首先,检查是安装的哪个 OpenJDK包. # dpkg --list | grep -i jdk 移除 openjdk包: # apt-get purge ...

  3. UTF-8 BOM(EF BB BF)

    原标题:link标签和script标签跑到body下面,网页顶部有空白,出现“锘匡豢”乱码,UTF-8 BOM,EF BB BF 来自:http://tunps.com/link-and-script ...

  4. Oracle 自己主动诊断资料档案库 (ADR)、自己主动诊断工作流、ADRCI工具

    1.自己主动诊断工作流: 通过一个始终处于打开状态的内存中跟踪工具,数据库组件能够在第一次出现严重错误故障时捕获诊断数据.系统将自己主动维护一个称为"自己主动诊断资料档案库"的特殊 ...

  5. Foundation框架之NSString及其Mutable类型

    Foundation框架之NSString及其Mutable类型 目录 概述 对字符串的实用操作 拼接 拆分 字符串比较 是否包含某字符串 字数统计 大小写转换 具体的方法参见API 待研究 概述 对 ...

  6. open和fopen的区别

    open和fopen的区别: 1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓 ...

  7. Oracle的trunc和dbms_random.value随机取n条数据

    今天在review项目代码的时候看到这样一个问题,有一张号码表,每次需要从这样表中随机取6个空闲的号码,也就是每次取出来的6个号码应该都会有所不同.然后我就看到了这样的SQL select   t.* ...

  8. QQ上传大文件为什么这么快

    今天和同事在群里讨论“QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有时候我们通过QQ上传一个几百M的文件,竟然只用了几秒钟,从带宽上限制可以得出,实际上传文件是不可能的 ...

  9. 关于设置ScrollView的滚动条为隐藏的方法

    要实现ScrollView滚动条的隐藏,有两种方法, 一种是在XML的ScrollView布局中加入属性android:scrollbars="none" 另一种则是在代码中获取S ...

  10. Oracle基础 (十三)日期函数

    日期函数 SYSDATE --当前系统时间 select sysdate from dual; EXTRACT --获取当前年份 select extract(year from sysdate) f ...