cocos2d-x 模态对话框的实现

时间:2023-01-11 23:31:05

本人最近使用2dx,发现在做多窗口布局的时候, 菜单和layer之间耦合度太高了,新建层以后, 还会响应底层的菜单事件,很是不人性化

所以把2DX的代码改一下, 使其支持模态对话框,只响应当前层的菜单事件,不响应其它层的菜单事件!


具体改动如下:

1. CCLayer 中增加静态变量:

通过这个变量表示当前模态层的窗口指针,用于进行判断

staticcocos2d::CCLayer* s_pModelessLayer;


2.CCMenu的  CCMenu::ccTouchBegan  方法, 增加以下代码:

    if(CCLayer::s_pModelessLayer!=NULL)

    {

       bool bModelessParent = false;

        //如果模态对话框存在的话,则判断菜单项的父窗口, 在模态对话框中的菜单则响应,否则忽略

       for (CCNode *c =this->m_pParent; c !=NULL; c = c->getParent())

        {

            if (c==CCLayer::s_pModelessLayer)

            {

                bModelessParent =true;

               break;

            }

        }

       if(!bModelessParent)returnfalse;

    }

代码中有一次遍历操作, 这样便可在模态层中建立多级子窗口下的子菜单进行定位,正确响应这些菜单


3.具体使用:

有了以上两步, 就可以简单的通过设置变量s_pModelessLayer 进行模态对话框的操作了,如果想做的更OO一些,则可以建立一个自己的CCLayer子类, 并加入一个DoModal()方法,进行一次封装便可以了, 然后在关闭窗口的地方把s_pModelessLayer设置成空就可以了。