首页 > 代码库 > cocos2dx 3.x(纯代码实现弹出对话框/提示框/警告框)
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(纯代码实现弹出对话框/提示框/警告框)