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. 提示框 ...
随机推荐
- NOIP2018旅游记
2018.12.4更新: GD分数线出了,1=分数线310,1=了 好歹能和cyp交代了吧) 2018.11.28更新: 不好意思,太懒了,加上我也不记得后来发生什么了,总之就这样太监了. noip2 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 I. Lattice's basics in digital electronics 阅读题加模拟题
题意:https://nanti.jisuanke.com/t/31450 题解:题目很长的模拟,有点uva的感觉 分成四步 part1 16进制转为二进制string 用bitset的to_stri ...
- Will vs Be Going To vs Present Continuous: Talk About the Future in English
https://www.youtube.com/watch?v=UISiuiPd_FY will 说话的当下决定的将来要做什么,in the moment be going to 有意图去做,但没有计 ...
- Java之旅_面向对象_接口
参考摘自:http://www.runoob.com/java/java-interfaces.html 接口(interface)在Java中是一个抽象类型,是抽象方法的集合. 一个类通过imple ...
- 目标检测(3)-SPPNet
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 文章地址:https://arxiv.org ...
- 原生js获取到页面上所有的checkbox
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- 【PyQt5-Qt Designer】QSlider滑块
QSlider滑块 QSlider简介 QSlider小部件提供了一个垂直或水平滑块. 滑块是控制有界值的经典控件.它允许用户沿水平或垂直凹槽移动滑块手柄,并将手柄的位置转换为合法范围内的整数值. Q ...
- java public,default,protected,private区别
温习一下:https://www.cnblogs.com/ldq2016/p/6872420.html
- innodb_flush_method理解【转】
innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的: 有三个值:fdatasync(默认),O_DSYNC,O ...
- centos who命令 查看当前登录系统用户信息
who 显示当前登录系统的用户,但w显示的更为详细 默认输出 [root@mysql ~]# who //用户名.登录终端.登录时间 root pts/ -- : (192.168.0.110) -a ...