在上一篇文章中,我们利用CCEditBox实现了输入框功能,使我们在注册时可以输入用户名和密码。但是当用户名和密码的输入不符合规范时,我们应该怎样给与用户提示呢?下面我们就来介绍弹出框的实现方式。

我们的思路就是,创建一个模态层,将当前场景的内容盖住,然后在弹出层上给与用户相应的提示并提供一个关闭弹出层的按钮。首先,我们先来看一下效果。

这里的标题和具体提示信息需要是自定义的,才能满足不同场景的需要,而确定按钮只是用来关闭弹出层的,所以这个弹出框的主要元素并不多,实现起来也比较简单。

另外,还有一种弹出框,是用来确认是否执行某种操作的,效果如下:

这种弹出框需要两个按钮,取消按钮是终止操作,和前一个弹出框的确定按钮效果相同,都是直接关闭弹出层即可。而这里的确定按钮,是确定要执行操作,点击后,需要执行确认的操作,及执行调用弹出层的节点中的某个方法。这里的实现就比前一种弹出框复杂一些,需要有调用弹出层的对象和需要执行的函数。下面我们就来看一下具体的实现。

PopLayer.h文件

 #ifndef __MyGame__PopLayer__
#define __MyGame__PopLayer__ #include <iostream>
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT; class PopLayer:public CCLayer{
public:
//初始化
virtual bool init(); //创建
CREATE_FUNC(PopLayer); //创建确定弹出框
static PopLayer * create(const char * title,const char * content); //创建确定取消弹出框
static PopLayer * create(const char * title,const char * content,CCObject * callbackListener,SEL_CallFuncN callfun); //设置弹出框的title
void setTitle(const char * title); //设置弹出框的文本内容
void setContent(const char * content); //设置确定按钮
void setConfirmButton(); //设置确定取消按钮,参数:调用层对象,调用层回调函数
void setConfirmCancelButton(CCObject * callbackListener,SEL_CallFuncN callfun); private:
//重写触摸注册函数,重新给定触摸级别
void registerWithTouchDispatcher(); //触摸函数ccTouchBegan,返回true
bool ccTouchBegan(CCTouch * touch,CCEvent * pevent); //关闭弹出框
void closePopLayer(CCObject * pSender); //执行上层对象的回调函数,关闭弹出框
void buttonCallBackFunc(CCObject * pSender); //上层对象
CCObject * m_callbackListener; //回调函数
SEL_CallFuncN m_callfun; //对话框背景大小
CCSize m_size; //对话框背景精灵
CCSprite * m_bgSprite;
}; #endif /* defined(__MyGame__PopLayer__) */

PopLayer.cpp文件

 #include "PopLayer.h"
USING_NS_CC; //创建确定弹出框
PopLayer * PopLayer::create(const char * title,const char * content)
{
PopLayer * popLayer = PopLayer::create(); //设置题目和文本内容
popLayer->setTitle(title);
popLayer->setContent(content); //设置按钮
popLayer->setConfirmButton(); return popLayer;
} //创建确定取消弹出框
PopLayer * PopLayer::create(const char * title,const char * content,CCObject * callbackListener,SEL_CallFuncN callfun)
{
PopLayer * popLayer = PopLayer::create(); //设置题目和文本内容
popLayer->setTitle(title);
popLayer->setContent(content); //设置按钮
popLayer->setConfirmCancelButton(callbackListener,callfun); return popLayer;
} //初始化
bool PopLayer::init()
{
if ( !CCLayer::init() ){
return false;
} //精灵帧缓存
CCSpriteFrameCache * sfCache = CCSpriteFrameCache::sharedSpriteFrameCache();
sfCache->addSpriteFramesWithFile("p_tips.plist"); //添加模态背景
ccColor4B color = ccc4(, , , );
CCLayerColor * colorLayer = CCLayerColor::create(color);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
colorLayer->setPosition(CCPointZero);
colorLayer->setContentSize(winSize);
this->addChild(colorLayer); //设置这个层的背景图片,并且设置其位置为屏幕中点
CCSpriteFrame * f_tips_box = sfCache->spriteFrameByName("tips_box.png");
CCSprite * spriteBox = CCSprite::createWithSpriteFrame(f_tips_box);
m_bgSprite = spriteBox;
spriteBox->setPosition(ccp(winSize.width/,winSize.height/));
this->addChild(spriteBox); //获得背景图片的大小
CCSize contentSize = spriteBox->getContentSize();
m_size = contentSize; //开启触摸响应
this->setTouchEnabled(true); return true;
} //设置弹出框的title,1/4高度
void PopLayer::setTitle(const char * title)
{
CCLabelTTF * titleStr = CCLabelTTF::create(title,"Arial",);
titleStr->setColor(ccBLACK);
titleStr->setPosition(ccp(m_size.width/, m_size.height*(1.0-(1.0/)/)));
m_bgSprite->addChild(titleStr);
} //设置弹出框的文本内容,1/2高度
void PopLayer::setContent(const char * content)
{
CCLabelTTF * contentStr = CCLabelTTF::create(content,"Arial",);
contentStr->setColor(ccBLACK);
contentStr->setPosition(ccp(m_size.width/,m_size.height*(1.0-(1.0/)-(1.0/)/)));
//设置文本域
contentStr->setDimensions(CCSize(this->m_size.width-,this->m_size.height-));
//设置水平对齐方式
contentStr->setHorizontalAlignment(kCCTextAlignmentLeft); m_bgSprite->addChild(contentStr);
} //设置确定按钮
void PopLayer::setConfirmButton()
{
CCSpriteFrameCache * sfCache = CCSpriteFrameCache::sharedSpriteFrameCache(); CCSpriteFrame * f_tips_btn_confirm_normal = sfCache->spriteFrameByName("btn_confirm_normal.png");
CCSprite * sprite_tips_btn_confirm_normal = CCSprite::createWithSpriteFrame(f_tips_btn_confirm_normal); CCSpriteFrame * f_tips_btn_confirm_select = sfCache->spriteFrameByName("btn_confirm_select.png");
CCSprite * sprite_tips_btn_confirm_select = CCSprite::createWithSpriteFrame(f_tips_btn_confirm_select); CCMenuItemSprite * itemConfirm = CCMenuItemSprite::create(sprite_tips_btn_confirm_normal, sprite_tips_btn_confirm_select, this, menu_selector(PopLayer::closePopLayer)); itemConfirm->setPosition(ccp(m_size.width/,m_size.height*(1.0-(1.0/)-(1.0/)-(1.0/)/))); CCPoint bgSpritePoint = m_bgSprite->getPosition();
CCMenu * menu = CCMenu::create(itemConfirm,NULL);
menu->setPosition(ccp(bgSpritePoint.x-m_size.width/,bgSpritePoint.y-m_size.height/));//菜单位置设置为弹出框左下
this->addChild(menu);
} //设置确定取消按钮,参数:调用层对象,调用层回调函数
void PopLayer::setConfirmCancelButton(CCObject * callbackListener,SEL_CallFuncN callfun)
{
m_callbackListener = callbackListener;
m_callfun = callfun; CCSpriteFrameCache * sfCache = CCSpriteFrameCache::sharedSpriteFrameCache(); //确定
CCSpriteFrame * f_tips_btn_confirm_normal = sfCache->spriteFrameByName("btn_confirm_normal.png");
CCSprite * sprite_tips_btn_confirm_normal = CCSprite::createWithSpriteFrame(f_tips_btn_confirm_normal); CCSpriteFrame * f_tips_btn_confirm_select = sfCache->spriteFrameByName("btn_confirm_select.png");
CCSprite * sprite_tips_btn_confirm_select = CCSprite::createWithSpriteFrame(f_tips_btn_confirm_select); CCMenuItemSprite * itemConfirm = CCMenuItemSprite::create(sprite_tips_btn_confirm_normal, sprite_tips_btn_confirm_select, this, menu_selector(PopLayer::buttonCallBackFunc)); itemConfirm->setPosition(ccp(m_size.width*(1.0/),m_size.height*(1.0-(1.0/)-(1.0/)-(1.0/)/))); //取消
CCSpriteFrame * f_tips_btn_cancel_normal = sfCache->spriteFrameByName("btn_cancel_normal.png");
CCSprite * sprite_tips_btn_cancel_normal = CCSprite::createWithSpriteFrame(f_tips_btn_cancel_normal); CCSpriteFrame * f_tips_btn_cancel_select = sfCache->spriteFrameByName("btn_cancel_select.png");
CCSprite * sprite_tips_btn_cancel_select = CCSprite::createWithSpriteFrame(f_tips_btn_cancel_select); CCMenuItemSprite * itemCancel = CCMenuItemSprite::create(sprite_tips_btn_cancel_normal, sprite_tips_btn_cancel_select, this, menu_selector(PopLayer::closePopLayer)); itemCancel->setPosition(ccp(m_size.width*(2.0/),m_size.height*(1.0-(1.0/)-(1.0/)-(1.0/)/))); CCPoint bgSpritePoint = m_bgSprite->getPosition();
CCMenu * menu = CCMenu::create(itemConfirm,itemCancel,NULL);
menu->setPosition(ccp(bgSpritePoint.x-m_size.width/,bgSpritePoint.y-m_size.height/));//菜单位置设置为弹出框左下
this->addChild(menu);
} //执行上层对象的回调函数,关闭弹出框
void PopLayer::buttonCallBackFunc(CCObject * pSender)
{
CCNode * node = dynamic_cast<CCNode *>(pSender);
node->setTag();//设置tag,在调用层可以获取到 if (m_callfun && m_callbackListener)
{
//执行调用层回调函数,传递参数CCNode
(m_callbackListener->*m_callfun)(node);
} this->removeFromParentAndCleanup(true);
} //关闭弹出框
void PopLayer::closePopLayer(CCObject * pSender)
{
this->removeFromParentAndCleanup(true);
} //重写触摸注册函数,重新给定触摸级别
void PopLayer::registerWithTouchDispatcher()
{
//这里的触摸优先级设置为-128,与CCMenu同级,保证了屏蔽下方的触摸
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -, true);
} //触摸函数ccTouchBegan,返回true
bool PopLayer::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )
{
return true;
}

我们的两个create函数分别对应了两种弹出框的创建,这两种弹出框应该足够我们使用了。下面我们来看看调用的代码。

第一种弹出框的调用

 CCLayer * popLayer = PopLayer::create("cocos2dx学习之旅","嗨!我是yangxq,我们一起来学习cocos2dx吧!");
this->addChild(popLayer);

第二种弹出框的调用

 CCLayer * popLayer = PopLayer::create("tips","嗨!我是yangxq,我们一起来学习cocos2dx吧!",this,callfuncN_selector(RegisterHandleLayer::callfunN));
this->addChild(popLayer);

第二种弹出框触发的函数

 void RegisterHandleLayer::callfunN(CCNode * node)
{
CCLog("Tag:%d",node->getTag());
}

我们在第二种弹出框中点击“确定”后,可以看到效果如下:

我们可以看到输出的日志,说明关闭弹出框后成功触发了调用层的函数,至此我们实现了弹出框功能。

cocos2dx2.2.2弹出框的实现的更多相关文章

  1. 关于Layer弹出框初探

    layer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,laye ...

  2. angularjs 弹出框 $modal

    angularjs 弹出框 $modal 标签: angularjs 2015-11-04 09:50 8664人阅读 评论(1) 收藏 举报  分类: Angularjs(3)  $modal只有一 ...

  3. 【代码笔记】iOS-自定义弹出框

    代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [s ...

  4. Android----消息弹出框

    关于Android的知识,自从工作了就没有什么时间去总结学习过的知识,我个人比较喜欢学习后总结,今天就写一下关于android中消息弹出框的几种方式的简单示例,按照自己的思路写了一段,希望对和我一样在 ...

  5. bootstrap中popover.js(弹出框)使用总结+案例

    bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...

  6. div非弹出框半透明遮罩实现全屏幕遮盖css实现

    IE浏览器下设置元素css背景为透明: background-color: rgb(0, 0, 0); filter: alpha(opacity=20); 非IE浏览器下设置元素css背景为透明: ...

  7. Visual Studio 打开解决方案后 弹出框显示 "正在打开文件..." 迟迟没反应 的解决方法

    Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 ...

  8. 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码】

    项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript ...

  9. JS组件系列——Bootstrap寒冬暖身篇:弹出框和提示框效果以及代码展示

    前言:对于Web开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编辑功能,一般常见的主要有两种处理方式:行内编辑和弹出框编辑.在增加用户体验方面,弹出框和提示框起着重要的作用,如果你的 ...

随机推荐

  1. Hadoop: The Definitive Guide (3rd Edition)

    chapter 1 解决计算能力不足的问题,不是去制造更大的计算机,而是用更多的计算机来解决问题. 我们生活在一个数据的时代.“大数据”的到来不仅仅是影响到那些科研和金融机构,对小型企业以及我们个人都 ...

  2. Delphi和JAVA用UTF-8编码进行Socket通信例子

    最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...

  3. 【JavsScript】当 JavaScript 从入门到提高前需要注意的细节:变量部分

    在javaScript中变量使用var声明的变量是当前作用域的变量,不使用var声明的则肯定是全局变量. http://msdn.microsoft.com/zh-cn/library/dn64545 ...

  4. Topcomponent --sighoff

    Topcomponent --sighoff 实现一个置于右边框的Topcomponent: 1.可远程同步更新(根据远程的xml文件),修改(增删)该xml文件,查看.刷新等 2.打包工程,记录该打 ...

  5. 深入了解android平台的jni(一)

    android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中.     主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的 ...

  6. oc-26-动态类型检测

    /** 1).判断对象是不是指定类的对象或者指定类的子类对象. - (BOOL)isKindOfClass:(Class)aClass; 2).判断对象是不是1个特定类型的对象,不包括子类. - (B ...

  7. Linux中的svn客户端RabbitVCS-2

    我们都知道,自从svn出道以来,很多人都预言,cvs将会被其取代.就如同他们预言maven要取代ant一样.可见,svn的流行.在Windows中,最常用到的开源免费的svn客户端就是Tortoise ...

  8. Mac上安装Tomcat服务器

    1.下载Tomcat安装包,下载地址:http://tomcat.apache.org/ 选择你想要的版本,在这里我选择下载Tomcat 8 ps:你也可以使用axel多线程下载命令下载 下载的速度很 ...

  9. SpringMVC上传(通过物理路径)

    内容来源:http://blog.csdn.net/kouwoo/article/details/40507565 一.配置文件:SpringMVC 用的是 的MultipartFile来进行文件上传 ...

  10. hadoop群集安装中碰到的问题

    在hadoop群集安装结束后,进行格式测试出现问题如下 格式化 cd /data/hadoop/bin ./hdfs namenode -format 15/01/21 05:21:17 WARN f ...