在上一篇文章中,我们利用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. UML精粹学习 - 订单类结构图

    Order Class Diagram of Martin Fowler's UML Distilled

  2. UVA 12906 Maximum Score 排列组合

    Maximum Score Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vie ...

  3. hdu 5273 Dylans loves sequence 逆序数简单递推

    Dylans loves sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  4. DES加密解密(适用Windows和Linux系统)防止linux下解密失败

    转自:http://blog.csdn.net/jerry_bj/article/details/8276552 package com.lasun.util; import java.io.File ...

  5. 【OC语法快览】四、基础内存管理

    Basic Memory Management                                                           基础内存管理 If you're w ...

  6. 自增锁ID复用问题

    mysql> select * from pp; +----+------+ | id | name | +----+------+ | xx | | xx | | xx | | xx | | ...

  7. 过滤文本文档中的数据并插入Cassandra数据库

    代码如下: package com.locationdataprocess; import java.io.BufferedReader; import java.io.File; import ja ...

  8. SPI的工作模式口诀[转]

    口诀:03升,12降,低取小,高取大 ! 解释: 1. 03升,12降: 0.3模式为上升沿采样,1.2模式为下降沿采样. 2. 低取小,高取大:SCK初始电平为低则模式取小值,SCK初始电平为高则模 ...

  9. hdu1050 Moving Tables

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1050 求区间上点的最大重叠次数. #include <stdio.h> #include &l ...

  10. 安装PIL库时提示python未注册错误(自定义python安装路径)

    import sys from _winreg import * # tweak as necessary version = sys.version[:3] installpath = sys.pr ...