用cocos2dx实现模态对话框

ui部分使用了cocoStudio,注意这里没有实现怎么屏蔽其他的输入事件,其他的文档已经太多了,我这里使用的cocoStudio的控件自己的特性。

这里强烈推荐一下cocoStudio,虽然现在还有不完善的地方,但是我个人感觉做的很不错了。

下面是代码,编译的时候请开启c++11.

//UI_ModalDialogue_Layer.h
#ifndef __UI_MODAL_DIALOGUE_LAYER_H__
#define __UI_MODAL_DIALOGUE_LAYER_H__#include "cocos2d.h"
#include "cocos-ext.h"
#include <functional>typedef std::function<void(void)> pCall;class UI_ModalDialogue_Layer : public cocos2d::extension::UILayer
{
public:enum DialogueType{DT_Normal = 0,DT_Ok,DT_Yes_No,};enum ResultTag{RT_Ok = 0,RT_YES,RT_NO,};
private:UI_ModalDialogue_Layer(void);~UI_ModalDialogue_Layer(void);CREATE_FUNC(UI_ModalDialogue_Layer);virtual bool init();public:static void DoModal(const char* szTitle,const char* szContent,DialogueType type=DT_Normal,pCall p=nullptr);static void HideModal();private:void updateLayer(const char* szTitle,const char* szContent,DialogueType type,pCall p);void btn_Click( cocos2d::CCObject* pSender );private:static UI_ModalDialogue_Layer* s_pInstance;cocos2d::extension::UILabel*    m_pLabCaption;cocos2d::extension::UILabel*    m_pLabContent;cocos2d::extension::UIButton*        m_pBtn_Ok;cocos2d::extension::UIButton*        m_pBtn_Yes;cocos2d::extension::UIButton*        m_pBtn_No;DialogueType            m_Type;pCall                    m_pFunc;
};#endif //__UI_MODAL_DIALOGUE_LAYER_H__

 

UI_ModalDialogue_Layer.cpp
#include "UI_ModalDialogue_Layer.h"USING_NS_CC;
USING_NS_CC_EXT;#define MODAL_DIALOGUE_ZORDER 9999UI_ModalDialogue_Layer* UI_ModalDialogue_Layer::s_pInstance = NULL;UI_ModalDialogue_Layer::UI_ModalDialogue_Layer(void)
{
}UI_ModalDialogue_Layer::~UI_ModalDialogue_Layer(void)
{}bool UI_ModalDialogue_Layer::init()
{if (!UILayer::init()){return false;}UIWidget* pWidget = CCUIHELPER->createWidgetFromJsonFile("ui/Model_Dialogue/Model_Dialogue.ExportJson");addWidget( pWidget );m_pLabCaption = (UILabel*)getWidgetByName("lbl_Caption");m_pLabContent = (UILabel*)getWidgetByName("lbl_Content");m_pBtn_Ok = (UIButton*)getWidgetByName("btn_OK");m_pBtn_Ok->addReleaseEvent(this,coco_releaseselector(UI_ModalDialogue_Layer::btn_Click));m_pBtn_Ok->setWidgetTag(RT_Ok);m_pBtn_Yes = (UIButton*)getWidgetByName("btn_Yes");m_pBtn_Yes->addReleaseEvent(this,coco_releaseselector(UI_ModalDialogue_Layer::btn_Click));m_pBtn_Yes->setWidgetTag(RT_YES);m_pBtn_No = (UIButton*)getWidgetByName("btn_No");m_pBtn_No->addReleaseEvent(this,coco_releaseselector(UI_ModalDialogue_Layer::btn_Click));m_pBtn_No->setWidgetTag(RT_NO);return true;
}void UI_ModalDialogue_Layer::btn_Click( CCObject* pSender )
{HideModal();if (m_pFunc){UIButton* pBtn = dynamic_cast<UIButton*>(pSender);CC_ASSERT( pBtn );int nTag = pBtn->getWidgetTag();if ( RT_Ok==nTag || RT_YES==nTag ){m_pFunc();}}
}void UI_ModalDialogue_Layer::updateLayer(const char* szTitle,const char* szContent,DialogueType type,pCall p)
{s_pInstance->m_pLabCaption->setText(szTitle);s_pInstance->m_pLabContent->setText(szContent);s_pInstance->m_Type = type;s_pInstance->m_pFunc = p;if (DT_Normal==s_pInstance->m_Type){m_pBtn_Ok->setVisible(false);m_pBtn_Yes->setVisible(false);m_pBtn_No->setVisible(false);}else if (DT_Ok==m_Type){m_pBtn_Ok->setVisible(true);m_pBtn_Yes->setVisible(false);m_pBtn_No->setVisible(false);}else if (DT_Yes_No==m_Type){m_pBtn_Ok->setVisible(false);m_pBtn_Yes->setVisible(true);m_pBtn_No->setVisible(true);}else{CCLOG("UI_ModalDialogue_Layer::error m_Type");}
}void UI_ModalDialogue_Layer::DoModal(const char* szTitle,const char* szContent,DialogueType type,pCall p)
{if (!s_pInstance){s_pInstance = UI_ModalDialogue_Layer::create();s_pInstance->retain(); //let it leak,that's allright
    }CC_ASSERT(s_pInstance);s_pInstance->HideModal();s_pInstance->updateLayer(szTitle,szContent,type,p);CCScene* pCurrentScene = CCDirector::sharedDirector()->getRunningScene();CC_ASSERT(pCurrentScene);pCurrentScene->addChild(s_pInstance,MODAL_DIALOGUE_ZORDER);CCLOG("UI_ModalDialogue_Layer::ShowModal()");}void UI_ModalDialogue_Layer::HideModal()
{if (s_pInstance&&s_pInstance->getParent()){s_pInstance->removeFromParent();CCLOG("UI_ModalDialogue_Layer::HideModal()");}
}

 

//使用的时候这样,最后一个传一个lamda表达式,很方便.

UI_ModalDialogue_Layer::DoModal("321","4343",UI_ModalDialogue_Layer::DT_Yes_No,[&](){this->foo();} );

转载于:https://www.cnblogs.com/mrblue/p/3254677.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程和线程(上)

点击上方“算法猿的成长”&#xff0c;选择“加为星标”第一时间关注 AI 和 Python 知识2019 年第 70 篇文章&#xff0c;总第 94 篇文章本文大约 6000 字&#xff0c;阅读大约需要 15 分钟最近会开始继续 Python 的进阶系列文章&#xff0c;这是该系列的第一篇文章&#xff0c…

ZOJ 1057 Undercut(简单模拟)

Undercut 题目链接&#xff1a;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId57 题目大意&#xff1a;a card game,two player,每个player有n张牌&#xff0c;按顺序出牌&#xff0c;如果2张牌的点数相等&#xff0c;2个player都不得分&#xff1b;如果2张牌点…

你有哪些deep learning(rnn、cnn)调参的经验?

点击上方“算法猿的成长”&#xff0c;选择“加为星标”第一时间关注 AI 和 Python 知识来源&#xff1a;知乎问题深度学习中调参其实是一个比较重要的技巧&#xff0c;但很多时候都需要多尝试多积累经验&#xff0c;因此算法工程师也被调侃为调参工程师。这里分享来自知乎上的…

A+B for Matrices 及 C++ transform的用法

题目大意&#xff1a;给定两个矩阵&#xff0c;矩阵的最大大小是M*N&#xff08;小于等于10&#xff09;&#xff0c;矩阵元素的值的绝对值小于等于100&#xff0c;求矩阵相加后全0的行以及列数。 1 #include<iostream>2 using namespace std;3 #define N 104 5 int main…

进程和线程(下)

点击上方“算法猿的成长”&#xff0c;选择“加为星标”第一时间关注 AI 和 Python 知识2019 年第 71 篇文章&#xff0c;总第 95 篇文章本文大约 8000 字&#xff0c;建议收藏阅读上一篇文章介绍了进程和线程的基本概念&#xff0c;以及多进程如何实现&#xff0c;本文则介绍下…

SPOJ MYQ10 (数位DP)

题意 询问区间[a,b]中的Mirror Number的个数&#xff0c;其中Mirror Number是指把它横着翻转后还能表示同样的数字。 思路 注意这个可不是回文数。。除了0,1,8&#xff0c;别的数字翻转过后就不是数字了。所以策略就是记忆化按位搜索&#xff0c;每位只搜0,1,8&#xff0c;最后…

8月总结抽奖

1首先是小小总结下 8 月发文的情况&#xff0c;总共推文时间是 21 天&#xff0c;原创文章有 9 篇&#xff0c;分别如下&#xff1a;Jupyter 进阶教程PyTorch 系列 | 数据加载和预处理教程PyTorch系列 | 如何加快你的模型训练速度呢&#xff1f;Leetcode 系列 | 反转链表PyTorc…

【文件系统】浅解释FAT32

了解完linux下的文件系统之后&#xff0c;顺便对FAT32也研究一下。 假如一个FAT32表如下所示。 文件的簇应该保留在目录中&#xff0c;根据此簇&#xff0c;应该能得到一个块。 要找到文件的下一块&#xff0c;就要根据簇在FAT中寻找&#xff0c;所以FAT中存储的不是本簇的簇号…

全网首发!2020年AI、CV、NLP顶会最全时间表!

点上方蓝字计算机视觉联盟获取更多干货在右上方 设为星标 ★&#xff0c;与你不见不散编辑&#xff1a;Sophia计算机视觉联盟 原创总结 | 公众号 CVLianMeng联盟花费一周对2020年顶会时间进行了总结&#xff01;2020 AI、CV、NLP顶会时间表&#xff0c;包含会议举办的时间、…

putty自动登录设置

1.用PuTTY SSH 密钥生成工具puttygen.exe生成密钥. 生成的密钥类型使用默认的SSH-2 RSA&#xff0c;位长度改为1024位 点击“生成”按钮&#xff0c;然后再在空白区域移动鼠标,以便产生随机数据&#xff0c;直至生成完密钥数据。 点击保存私钥(可以不设置密码保护). 2.SSH密码方…

互联网大佬学历背景大揭秘,看看是你的老乡还是校友

作者&#xff1a;徐麟&#xff0c;某互联网公司数据分析狮&#xff0c;个人公众号数据森麟&#xff08;id&#xff1a;shujusenlin&#xff09;前言 互联网作为一个快速发展的新兴领域&#xff0c;聚集了大量的优秀人才&#xff0c;前沿技术的广泛应用也不断地为互联网注入着新…

Setup SQL Server 2008 Maintenance Plan Email Notifications

一条龙作完&#xff0c;如何设置EXCHANGE的操作员邮件通知。。 ~~~~ http://808techblog.com/2009/07/setup-sql-server-2008-maintena.html For most of the SQL installs that I maintain, nightly SQL dumps to disk and then copy to tape is my preferred backup method. …

PyTorch | 保存和加载模型教程

点击上方“算法猿的成长”&#xff0c;选择“加为星标”第一时间关注 AI 和 Python 知识图片来自 Unsplash&#xff0c;作者&#xff1a; Jenny Caywood 2019 年第 72 篇文章&#xff0c;总第 96 篇文章总共 7000 字&#xff0c;建议收藏阅读原题 | SAVING AND LOADING MODELS作…

RMI(Remote Method Invocation,远程方法调用)

RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09; RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09;是用Java在JDK1.1中实现的&#xff0c;它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语…