用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 9999 UI_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();} );