cocos2dx 3.x(纯代码实现弹出对话框/提示框/警告框)
头文件:
//
// PopAlertDialog.h
// macstudycocos2dx
//
// Created by WangWei on 15/6/8.
//
//
#ifndef __macstudycocos2dx__PopAlertDialog__
#define __macstudycocos2dx__PopAlertDialog__
#pragma once
#include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT;
class PopAlertDialog:public LayerColor{ //继承LayerColor类,方便更改layer的颜色和透明度
public:
PopAlertDialog();
~PopAlertDialog();
virtual bool init();
CREATE_FUNC(PopAlertDialog);
static PopAlertDialog* create(const char* backgroudImage,Size dialogSize);
bool onTouchBegan(Touch* touch,Event* event);
void onTouchMoved(Touch* touch,Event* event);
void onTouchEnded(Touch* touch,Event* event);
void setTitle(const char* title,int fontsize=20);
void setContentText(const char* text,int fontsize=20,int padding=50,int paddingTop=50);
void setCallBackFunc(Ref* target,SEL_CallFuncN callfun);
bool addButton(const char* normalImage,const char* selectedImage,const char* title,int tag=0);
virtual void onEnter();
virtual void onExit();
void backgroundFinish();
private:
void buttonCallBack(Ref* pSender);
int m_contentPadding;
int m_contentPaddingTop;
Size m_dialogContentSize; //对话框大小
Ref* m_callbackListener;
SEL_CallFuncN m_callback;
CC_SYNTHESIZE_RETAIN(Menu*, m__pMenu, MenuButton);
CC_SYNTHESIZE_RETAIN(Sprite*, m__sfBackGround, SpriteBackGround);
CC_SYNTHESIZE_RETAIN(Scale9Sprite*, m__s9BackGround, Sprite9BackGround);
CC_SYNTHESIZE_RETAIN(LabelTTF*, m__ltTitle, LabelTitle);
CC_SYNTHESIZE_RETAIN(LabelTTF*, m__ltContentText, LabelContentText);
};
#endif /* defined(__macstudycocos2dx__PopAlertDialog__) */
cpp文件:
//
// PopAlertDialog.cpp
// macstudycocos2dx
//
// Created by WangWei on 15/6/8.
//
//
#include "PopAlertDialog.h"
PopAlertDialog::PopAlertDialog()
:
m__pMenu(NULL)
,m_contentPadding(0)
,m_contentPaddingTop(0)
,m_callbackListener(NULL)
,m_callback(NULL)
,m__sfBackGround(NULL)
,m__s9BackGround(NULL)
,m__ltContentText(NULL)
,m__ltTitle(NULL)
{
}
PopAlertDialog::~PopAlertDialog(){
CC_SAFE_RELEASE(m__pMenu);
CC_SAFE_RELEASE(m__sfBackGround);
CC_SAFE_RELEASE(m__s9BackGround);
CC_SAFE_RELEASE(m__ltContentText);
CC_SAFE_RELEASE(m__ltTitle);
}
bool PopAlertDialog::init(){
if (!CCLayerColor::init()) {
return false;
}
Menu* menu=Menu::create();
menu->setPosition(CCPointZero);
setMenuButton(menu);
auto listener=EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan=CC_CALLBACK_2(PopAlertDialog::onTouchBegan, this);
listener->onTouchMoved=CC_CALLBACK_2(PopAlertDialog::onTouchMoved, this);
listener->onTouchEnded=CC_CALLBACK_2(PopAlertDialog::onTouchEnded, this);
auto dispatcher=Director::getInstance()->getEventDispatcher();
dispatcher->addEventListenerWithSceneGraphPriority(listener, this);
//设置弹出层的颜色,指定为淡灰色
setColor(Color3B::GRAY);
setOpacity(128);
return true;
}
bool PopAlertDialog::onTouchBegan(Touch* touch,Event* event){
return true;
}
void PopAlertDialog::onTouchMoved(Touch* touch,Event* event){
}
void PopAlertDialog::onTouchEnded(Touch* touch,Event* event){
}
PopAlertDialog* PopAlertDialog::create(const char* backgoundImage,Size dialogSize){
//创建弹出对话框,指定背景图和大小。
PopAlertDialog* layer=PopAlertDialog::create();
//layer->setSpriteBackGround(Sprite::create(backgoundImage));
layer->setSprite9BackGround(Scale9Sprite::create(backgoundImage));
layer->m_dialogContentSize=dialogSize;
return layer;
}
void PopAlertDialog::setTitle(const char* title,int fontsize /*=20*/){
LabelTTF* label=LabelTTF::create(title, "", fontsize);
label->setColor(Color3B::RED);
setLabelTitle(label);
}
void PopAlertDialog::setContentText(const char* text,int fontsize,int padding,int paddingTop){
LabelTTF* ltf=LabelTTF::create(text, "", fontsize);
ltf->setColor(Color3B::BLUE);
setLabelContentText(ltf);
m_contentPadding=padding;
m_contentPaddingTop=paddingTop;
}
void PopAlertDialog::setCallBackFunc(Ref*target, SEL_CallFuncN callfun){
m_callbackListener=target;
m_callback=callfun;
}
bool PopAlertDialog::addButton(const char *normalImage, const char *selectedImage,const char* title,int tag){
Size winSize=Director::getInstance()->getWinSize();
Point center_point=Point(winSize.width/2,winSize.height/2);
auto menuImage=MenuItemImage::create(
normalImage,
selectedImage,
CC_CALLBACK_1(PopAlertDialog::buttonCallBack,this) );
menuImage->setTag(tag);
menuImage->setPosition(center_point);
Size menuSize=menuImage->getContentSize();
Label* labelttf=Label::createWithTTF(title, "fonts/arial.ttf", 15);
labelttf->setColor(Color3B(Color3B::BLACK));
labelttf->setPosition(Point(menuSize.width/2,menuSize.height/2));
menuImage->addChild(labelttf);
getMenuButton()->addChild(menuImage);
return true;
}
void PopAlertDialog::buttonCallBack(Ref* pSender){
Node* node=dynamic_cast<Node*>(pSender);
//log("[========PopAlertDialog:buttonCallBack=======]touch tag:%d",node->getTag());
if (m_callback&&m_callbackListener) {
(m_callbackListener->*m_callback)(node);
}
this->removeFromParentAndCleanup(true);
}
void PopAlertDialog::onEnter(){
//log("PopAlertDialog::onEnter is loading");
LayerColor::onEnter();
Size winSize=Director::getInstance()->getWinSize();
Point center=Point(winSize.width/2,winSize.height/2);
//Sprite* background=getSpriteBackGround();
Scale9Sprite* background=getSprite9BackGround();
background->setContentSize(m_dialogContentSize);//指定对话框大小
background->setPosition(Point(winSize.width/2,winSize.height/2));
this->addChild(background,0,0);
Action* popupActions=Sequence::create( ScaleTo::create(0.0, 0.0),
ScaleTo::create(0.06, 1.05),
ScaleTo::create(0.08, 0.95),
ScaleTo::create(0.08,1.0),
CallFunc::create(CC_CALLBACK_0(PopAlertDialog::backgroundFinish, this))
, NULL);
background->runAction(popupActions);
}
void PopAlertDialog::backgroundFinish(){
Size winSize=Director::getInstance()->getWinSize();
Point pCenter=Point(winSize.width/2,winSize.height/2);
this->addChild(getMenuButton());
float btnWidth=m_dialogContentSize.width/(getMenuButton()->getChildrenCount()+1);
Vector<Node*> vector=getMenuButton()->getChildren();
Ref* pObj=NULL;
int i=0;
for (Node*pObj:vector){
Node* node=dynamic_cast<Node*>(pObj);
node->setPosition(Point(winSize.width/2-m_dialogContentSize.width/2+btnWidth*(i+1),winSize.height/2-m_dialogContentSize.height/3));
i++;
}
if (getLabelTitle()) {
getLabelTitle()->setPosition(ccpAdd(pCenter, ccp(0,m_dialogContentSize.height/2-35.0f)));
this->addChild(getLabelTitle());
}
if (getLabelContentText()) {
CCLabelTTF* ltf=getLabelContentText();
ltf->setPosition(ccp(winSize.width/2,winSize.height/2));
ltf->setDimensions(CCSizeMake(m_dialogContentSize.width-m_contentPadding*2, m_dialogContentSize.height-m_contentPaddingTop));
ltf->setHorizontalAlignment(kCCTextAlignmentLeft);
this->addChild(ltf);
}
}
void PopAlertDialog::onExit(){
log("PopAlertDialog onExit");
CCLayerColor::onExit();
}
调用:
MenuItemSprite* item1=MenuItemSprite::create(btn_normal_sprite, btn_select_sprite,nullptr,CC_CALLBACK_1(MenuItemSpritTest::select_learn,this));
select_learn方法:
void MenuItemSpritTest::select_learn(Object* pSender){
log("you had select this button");
PopAlertDialog* popup=PopAlertDialog::create("background01.png",Size(800,250));
popup->setTitle("Message");
popup->setContentText("This is a test message!",20,50,150);
popup->setCallBackFunc(this,callfuncN_selector(MenuItemSpritTest::popButtonCallback));
popup->addButton("btnreturn.png", "btnreturn.png", "OK",0);
popup->addButton("btnreturn.png", "btnreturn.png", "Cancel",1);
this->addChild(popup);
}
void MenuItemSpritTest::popButtonCallback(Node* pNode){
log("[==========]button call back.tag %d",pNode->getTag());
if (pNode->getTag()==0) {
Director::getInstance()->end();
}
if (pNode->getTag()==1) {
//pNode->getParent()->removeFromParent();
pNode->removeFromParent();
}
}
cocos2dx 3.x(纯代码实现弹出对话框/提示框/警告框)的更多相关文章
- 定义Foo() 函数,弹出对话框提示当前选中的是第几个单选框
function foo(){ var ele = document.getElementsByName("radioElement"); for(var i = 0;i<e ...
- Android 手机卫士--弹出对话框
在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private ...
- cocos2d-x学习日志(12) --弹出对话框的设计与实现
我们时常需要这么些功能,弹出一个层,给与用户一些提示,这也是一种模态窗口,在没有对当前对话框进行确认的时候,不能继续往下操作. 功能分析 我们设计一个对话框,对话框上有几个按钮(个数可定制),当然有个 ...
- php网页,想弹出对话框, 消息框 简单代码
php网页,想弹出对话框, 消息框 简单代码 <?php echo "<script language=\"JavaScript\">alert(\&q ...
- JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法(转)
原文:JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法 jquery-easyui是一个基于jquery的图形界面插件,利用easyui可以创建很多好看的网页界面 ...
- QT常用代码之加载动态库和弹出对话框
作者:朱金灿 来源:http://blog.csdn.net/clever101 加载动态库的代码: typedef void (*Execute)(); // 定义导出函数类型 QString st ...
- 10.JAVA之GUI编程弹出对话框Dialog
在上节基础上添加对话框显示错误信息. 代码如下: /*弹出对话框显示错误信息,对话框一般不单独出现,一般依赖于窗体.*/ /*练习-列出指定目录内容*/ import java.awt.Button; ...
- 【Telerik】弹出对话框RadWindow,确认删除信息
要做一个删除功能,但是删除前正常都要弹出对话框确认一下是否删除信息,防止误删信息.
- java selenium (十一) 操作弹出对话框
Web 开发人员通常需要利用JavaScript弹出对话框来给用户一些信息提示, 包括以下几种类型 阅读目录 对话框类型 1. 警告框: 用于提示用户相关信息的验证结果, 错误或警告等 2. 提示框 ...
随机推荐
- 电子产品使用感受之--Mac Mini 买了之后有什么用?-- 开发啊!
2019.01.29 更新 Mac Mini 2018这么强劲的性能,不用来做点儿什么真是可惜了. 如果只是用来看看Youtube视频,打开网页看看twitter什么的,那可真是巨大的浪费了. 因为这 ...
- css学习_css背景属性及其应用
css背景属性及其应用 1.背景 2.背景简写 3.背景透明(css3) 4.背景缩放(css3) 5.多背景图片(css3) 6.凹凸文字效果
- git add详解
git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件. git add -u :他仅监控 ...
- deepin修改javahome不生效,一直显示openjdk解决
删除/usr/bin/java即可 terwer@terwer-PC:~$ sudo rm /usr/bin/java [sudo] terwer 的密码: terwer@terwer-PC:~$ j ...
- OPTIMIZE TABLE linked list 表优化原理 链表数据结构 空间再利用
小结: 1.加快读写: 2.对于InnoDB表,在一定条件下,通过复制旧表重建: 3.实践中, 3.1.show processlist;查看线程,发现,认为堵塞读请求: 3.2.数据长度空间不变,索 ...
- Java+Selenium如何解决空指针
1.问题描述:浏览器获取当期窗口值获取为空.
- go不在dock显示运行
用这种方法就可以了go build -ldflags -H=windowsgui XXX.go
- CentOS SSH免密登陆
#环境说明客户机:Mac OS X服务器:CentOS 6.5客户端:OpenSSH,OS X及大多数Linux都内置了OpenSSH.’ssh -v’命令可以查看版本. #大致流程1.在客户机创建一 ...
- UVA11491 奖品的价值
奖品的价值C804 运行时间限制:1000ms: 运行空间限制:51200KB 试题描述 你是一个电视节目的获奖嘉宾.主持人在黑板上写出一个 n 位非负整数(不以 0 开头),邀请你删除其中的 d 个 ...
- MVC编程模式
MVC编程模式 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式: Model(模型)表示应用程序核心(比如数据库记录列表) ...