本人最近使用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设置成空就可以了。