zoukankan      html  css  js  c++  java
  • 用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();} );

  • 相关阅读:
    顺序表和链表优缺点
    指针和引用
    常见操作系统面试题
    网络套接字编程(UDP)
    Windows下的问题
    解决虚拟机选择桥接模式连不上网(CentOs6.5)
    DevOps平台实践
    Prometheus实现k8s集群的服务监控
    Kubernetes集群的日志EFK解决方案
    Helm
  • 原文地址:https://www.cnblogs.com/mrblue/p/3254677.html
Copyright © 2011-2022 走看看