cocos2dx2.2.2弹出框的实现
在上一篇文章中,我们利用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弹出框的实现的更多相关文章
- 关于Layer弹出框初探
layer至今仍作为layui的代表作,她的受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,laye ...
- angularjs 弹出框 $modal
angularjs 弹出框 $modal 标签: angularjs 2015-11-04 09:50 8664人阅读 评论(1) 收藏 举报 分类: Angularjs(3) $modal只有一 ...
- 【代码笔记】iOS-自定义弹出框
代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [s ...
- Android----消息弹出框
关于Android的知识,自从工作了就没有什么时间去总结学习过的知识,我个人比较喜欢学习后总结,今天就写一下关于android中消息弹出框的几种方式的简单示例,按照自己的思路写了一段,希望对和我一样在 ...
- bootstrap中popover.js(弹出框)使用总结+案例
bootstrap中popover.js(弹出框)使用总结+案例 *转载请注明出处: 作者:willingtolove: http://www.cnblogs.com/willingtolove/p/ ...
- div非弹出框半透明遮罩实现全屏幕遮盖css实现
IE浏览器下设置元素css背景为透明: background-color: rgb(0, 0, 0); filter: alpha(opacity=20); 非IE浏览器下设置元素css背景为透明: ...
- Visual Studio 打开解决方案后 弹出框显示 "正在打开文件..." 迟迟没反应 的解决方法
Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 ...
- 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码】
项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript ...
- JS组件系列——Bootstrap寒冬暖身篇:弹出框和提示框效果以及代码展示
前言:对于Web开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编辑功能,一般常见的主要有两种处理方式:行内编辑和弹出框编辑.在增加用户体验方面,弹出框和提示框起着重要的作用,如果你的 ...
随机推荐
- SQL Server-删除表中重复的记录!
比如现在有一人员表 (表名:peosons)若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 select p1.* from persons p1,persons p ...
- cdoj 1150 排名表 拓扑排序
排名表 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1150 Descrip ...
- [Ramda] Filter, Reject and Partition
We'll learn how to get a subset of an array by specifying items to include with filter, or items to ...
- android程序逆向工程
随着智能手机的普及,功能越来越强大.程序也越来多和复杂化.研究一下android系统的逆向工程也是挺有意思的. 目前android逆向工程还处于初级阶段.表现在于: 1.没有完整的动态调试程序.目前由 ...
- 提升GDI画图的效率
假设我们要画一个坐标图,里面可能还需要画网络线.XY各个单位的值.曲线或直线等,可能的函数代码如下: void OnPaint () { CPaintDC dc (this); DrawXY (&am ...
- spring security源码分析之一springSecurityFilterChain
1. spring和spring security的集成,配置web.xml如下: <context-param> <param-name>contextConfigLocat ...
- excel 批量替换换行符
在excel批量替换换行符操作步骤: 全选需要查找换行符的范围 CTRL+H调出查找和替换 在查找内容内输入"ctrl+enter"两个组合键 点击查找全部即可. 在excel中输 ...
- 1.4.1.Documents,Fields和Schema概述
Documents,Fields和Schema概述 solr的基本前提是非常简单,你可以给它很多信息,然后可以向它提出问题,获取你想要的问题的信息.所有信息输入的地方就叫做索引或者更新.当你提出问题时 ...
- js兼容性问题
javscript 浏览器兼容性问题: scrollTop = document.documentElement.scrollTop || document.body.scrollTop; scrol ...
- Flask-在浏览器中直接显示文本文件中的内容
目录结构: project├── info.json├── run.py└── static └── readme.txt # 直接返回static目录下的文件内容 @app.route( ...