首页 > 代码库 > 充分利用C++11特性,Cocos2dx对话框的实现
充分利用C++11特性,Cocos2dx对话框的实现
一般一个对话框会分为模态对话框和非模态对话框两种,模态对话框是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。非模态(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::function<void(Ref*)> fun,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::function<void(Ref*)> fun,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<void(Ref*)> 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图片要怎么展示出来 就先看着截图吧
充分利用C++11特性,Cocos2dx对话框的实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。