在上一篇文章中,我们利用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. rqnoj-217-拦截导弹-最长不上升子序列以及不上升子序列的个数

    最长上升子序列的O(n*log(n))算法. 不上升子序列的个数等于最长上升子序列的长度. #include<string.h> #include<stdio.h> #incl ...

  2. 多个非同源的shared_ptr管理对象引起double free

    有多个不同源的shared_ptr管理对象时会出现多次释放对象,这里不同源是指多组间不是通过拷贝构造.复制等手段而来的,即几组shared_ptr是独立声明的. #include<iostrea ...

  3. 读《架构探险——从零开始写Java Web框架》

    内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...

  4. 大话数据结构—平衡二叉树(AVL树)

    平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,当中每个节点的左子树和右子树的 ...

  5. Ambari源代码分析之总览

    一.基本概念: Resource:Ambari把能够被管理的资源的抽象为一个Resource实例,资源能够包括服务.组件.主机节点等,一个resource实例中包括了一系列该资源的属性: Proper ...

  6. python中的reduce(转)

    python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1 ...

  7. sun.misc.BASE64Encoder和sun.misc.BASE64Encoder 找不到解决的方法

    1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...

  8. 20 Free Open Source Web Media Player Apps

    free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...

  9. 基于 SquashFS 构建 Linux 可读写文件系统

    转载:http://www.oschina.net/question/129540_116839 在当前的嵌入式操作系统开发中,Linux 操作系统通常被压缩成 Image 后存放在 Flash 设备 ...

  10. tachyon 本地模式安装

    本地模式不用考虑hadoop的版本,所以直接下载 binary 包或者自己编译 1.配置主机名.JDK.关闭防火墙.关闭Selinux.配置hosts ... ... 2.设置本机SSH免密码登陆 . ...