展会信息港展会大全

充分利用C++11特性,Cocos2dx对话框的实现
来源:互联网   发布日期:2015-09-27 14:58:50   浏览:1358次  

导读: 一般一个对话框会分为模态对话框和非模态对话框两种,模态对话框是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。非模态(M...

一般一个对话框会分为模态对话框和非模态对话框两种,模态对话框是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。非模态(Modeless)对话框,又叫做无模式对话框,当用户打开非模态对话框时,依然可以操作其他窗口。例如,Windows提供的记事本程序中的【查找】对话框。(抄自百度百科)

目前我需要的一个对话框功能列表如下:

1.需要显示一段提示信息,可能是一段对话可能是一个问题。

2.必须有确认按钮,可能会有取消按钮

3.确认按钮的功能可自定义

下面是我的实现思路。

1.首先有一个初始化对话框的函数,将对话框初始化到内存中,因为对话框是一个很常用的功能,所以直接加入内存中就好了。

2.然后对话框需要载入功能和移除功能,这两样就是对话框的核心功能了

3.对话框需要按钮回调,一个是确认,一个是取消,确认可能还需要执行某些其他功能,我们可以用回调来实现,取消就直接关闭对话框,没什么好说的。

4.对话框分模态和非模态两种,模态就是在对话框层中加一个触摸屏蔽。

遵循着上面的思路,我对于对话框的函数设计如下:

//对话框

protected:

//初始化对话框

void InitDialog();

/* 加载对话框

* @parm:msg 消息 显示在界面上的提示消息

* @parm:fun 回调函数 给确定按钮调用的

* @parm:isNeedCancel 是否需要取消按钮

* @parm:isModalDialog 是否是模态对话框

*/

void LoadDialog(std::string msg,std::functionfun,bool isNeedCancel = false,bool isModalDialog = true);

//对话框加载完成

void LoadDialogFinish(Armature *a, MovementEventType b, std::string c);

//隐藏对话框

void HideDialog();

//隐藏对话框完成

void HideDialogFinish(Armature *a, MovementEventType b, std::string c);

//对话框取消按钮回调

void PressDialogCancelBtn(Ref *pSender, Widget::TouchEventType type);

//对话框确认按钮回调

void PressDialogConfirmBtn(Ref *pSender, Widget::TouchEventType type);

为什么会有对话框加载完成和对话框隐藏完成呢?是因为我把对话框的加载和隐藏做成了两个动画,所以需要这两个附加的函数。

OK 不多说,下面是函数的具体实现:

//----------------------------------------------------------对话框-------------------------------------------------------

//初始化对话框

void MomoScene::InitDialog()

{

ArmatureDataManager::getInstance()->addArmatureFileInfo("publish/DialogAnimation.ExportJson");

Dialog = Armature::create("DialogAnimation");

Dialog->retain();

Dialog->setPosition(getCenterPoint());

m_UI_Dialog->addChild(Dialog);

Dialog->setVisible(false);

//加载信息

m_DialogMsg = Label::create();

m_DialogMsg->retain();

m_DialogMsg->setVisible(false);

m_DialogMsg->setColor(Color3B::WHITE);

m_DialogMsg->enableGlow(Color4B::WHITE);

m_DialogMsg->setPosition(Point(0,0));

Dialog->addChild(m_DialogMsg,20);

//加载确认按钮

m_DialogConfirm = Button::create("Dialog_btn/confirm.png","Dialog_btn/confirm_press.png");

m_DialogConfirm->retain();

m_DialogConfirm->setPosition(Point(-80,-100));

m_DialogConfirm->setVisible(false);

Dialog->addChild(m_DialogConfirm);

//加载取消按钮

m_DialogCancel = Button::create("Dialog_btn/cacel.png","Dialog_btn/cacel_press.png");

m_DialogCancel->retain();

m_DialogCancel->setPosition(Point(80,-100));

m_DialogCancel->setVisible(false);

Dialog->addChild(m_DialogCancel);

}

//加载对话框

void MomoScene::LoadDialog(std::string msg,std::functionfun,bool isNeedCancel,bool isModalDialog)

{

Dialog->setVisible(true);

Dialog->getAnimation()->playWithIndex(0);

Dialog->getAnimation()

->setMovementEventCallFunc(CC_CALLBACK_3(MomoScene::LoadDialogFinish,this));

m_DialogMsg->setString(msg);

m_Dialog_ConfirmCallback = fun;

//是否需要关闭按钮

if(isNeedCancel == true)

{

m_DialogConfirm->addTouchEventListener(CC_CALLBACK_2(MomoScene::PressDialogConfirmBtn,this));

m_DialogCancel->addTouchEventListener(CC_CALLBACK_2(MomoScene::PressDialogCancelBtn, this));

m_DialogConfirm->setVisible(true);

m_DialogCancel->setVisible(true);

}

else

{

m_DialogConfirm->addTouchEventListener(CC_CALLBACK_2(MomoScene::PressDialogConfirmBtn,this));

m_DialogConfirm->setPosition(Point(0,-100));

m_DialogConfirm->setVisible(true);

m_DialogCancel->setVisible(false);

}

//模态对话框需要做一个吞噬触摸层

if(isModalDialog == true)

{

auto listener1 = EventListenerTouchOneByOne::create();//创建一个触摸监听

listener1->setSwallowTouches(true);//设置不想向下传递触摸

listener1->onTouchBegan = [](Touch* touch, Event* event){

CCLOG("touch Swallow");

return true;

};

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1,m_UI_Dialog);

}

}

void MomoScene::LoadDialogFinish(Armature *a, MovementEventType b, std::string c)

{

//动画完成

if(b == COMPLETE)

{

Dialog->getAnimation()->setMovementEventCallFunc(nullptr);

m_DialogMsg->setVisible(true);

}

}

//隐藏对话框

void MomoScene::HideDialog()

{

m_DialogMsg->setVisible(false);

m_DialogConfirm->setVisible(false);

m_DialogCancel->setVisible(false);

//移除触摸屏蔽

_eventDispatcher->removeEventListenersForTarget(m_UI_Dialog);

Dialog->getAnimation()->playWithIndex(1);

Dialog->getAnimation()

->setMovementEventCallFunc(CC_CALLBACK_3(MomoScene::HideDialogFinish,this));

}

//隐藏对话框完成

void MomoScene::HideDialogFinish(Armature *a, MovementEventType b, std::string c)

{

//动画完成

if(b == COMPLETE)

{

Dialog->getAnimation()->setMovementEventCallFunc(nullptr);

a->setVisible(false);

a->setOpacity(255);

}

}

//对话框取消按钮

void MomoScene::PressDialogCancelBtn(Ref *pSender, Widget::TouchEventType type)

{

switch(type)

{

case Widget::TouchEventType::ENDED:

HideDialog();

break;

}

}

//对话框确认按钮

void MomoScene::PressDialogConfirmBtn(Ref *pSender, Widget::TouchEventType type)

{

switch(type)

{

case Widget::TouchEventType::ENDED:

HideDialog();

if(m_Dialog_ConfirmCallback != nullptr)

m_Dialog_ConfirmCallback(NULL);

break;

}

}

值得一提的是 所有以m_开头的变量全部是类的成员变量,下面也给出这些变量的定义,其中有几个变量在类的构造函数中有初始化,也给出来

//标志变量

public:

bool m_IsNeedExit;

//UI变量

public:

Sprite* m_spr_ExitTip; //退出提示

Armature* Dialog; //对话框

Label* m_DialogMsg; //对话框消息

Button* m_DialogConfirm; //对话框确认按钮

Button* m_DialogCancel;//对话框取消按钮

//层变量

Layer* m_UI_Dialog;//对话框层 最高层

Layer* m_UI_Tool;//工具栏层 次高层

Layer* m_UI_Game;//游戏层 低层

Layer* m_UI_Background;//背景层 底层

//回调函数变量

public:

std::function m_Dialog_ConfirmCallback; //对话框确认回调

//------------------------------函数----------------------------------

public:

MomoScene():m_IsNeedExit(false),m_Dialog_ConfirmCallback(nullptr){};

~MomoScene(){};

下面是对话框的使用方法:

auto fun = [=](Ref* e){

CCLog("OK You enter the Confirm");

};

LoadDialog("You Enter Continue",fun,true);

上述对话框的实现效果如下:(因为素材不太好,为了更好的展示效果,我在显示对话框的时候将菜单移除了)

表示不知道GIF图片要怎么展示出来 就先看着截图吧

赞助本站

人工智能实验室
相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港