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开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编辑功能,一般常见的主要有两种处理方式:行内编辑和弹出框编辑.在增加用户体验方面,弹出框和提示框起着重要的作用,如果你的 ...
随机推荐
- rqnoj-217-拦截导弹-最长不上升子序列以及不上升子序列的个数
最长上升子序列的O(n*log(n))算法. 不上升子序列的个数等于最长上升子序列的长度. #include<string.h> #include<stdio.h> #incl ...
- 多个非同源的shared_ptr管理对象引起double free
有多个不同源的shared_ptr管理对象时会出现多次释放对象,这里不同源是指多组间不是通过拷贝构造.复制等手段而来的,即几组shared_ptr是独立声明的. #include<iostrea ...
- 读《架构探险——从零开始写Java Web框架》
内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...
- 大话数据结构—平衡二叉树(AVL树)
平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,当中每个节点的左子树和右子树的 ...
- Ambari源代码分析之总览
一.基本概念: Resource:Ambari把能够被管理的资源的抽象为一个Resource实例,资源能够包括服务.组件.主机节点等,一个resource实例中包括了一系列该资源的属性: Proper ...
- python中的reduce(转)
python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1 ...
- sun.misc.BASE64Encoder和sun.misc.BASE64Encoder 找不到解决的方法
1.右键项目->属性->java bulid path->jre System Library->access rules->resolution选择accessible ...
- 20 Free Open Source Web Media Player Apps
free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...
- 基于 SquashFS 构建 Linux 可读写文件系统
转载:http://www.oschina.net/question/129540_116839 在当前的嵌入式操作系统开发中,Linux 操作系统通常被压缩成 Image 后存放在 Flash 设备 ...
- tachyon 本地模式安装
本地模式不用考虑hadoop的版本,所以直接下载 binary 包或者自己编译 1.配置主机名.JDK.关闭防火墙.关闭Selinux.配置hosts ... ... 2.设置本机SSH免密码登陆 . ...