本人最近使用2dx,發現在做多窗口布局的時候, 菜單和layer之間耦合度太高了,新建層以後, 還會響應底層的菜單事件,很是不人性化
所以把2DX的代碼改一下, 使其支持模態對話框,只響應當前層的菜單事件,不響應其它層的菜單事件!
具體改動如下:
1. CCLayer 中增加靜態變量:
通過這個變量表示當前模態層的窗口指針,用於進行判斷
static cocos2d::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)return false;
}
代碼中有一次遍歷操作, 這樣便可在模態層中建立多級子窗口下的子菜單進行定位,正確響應這些菜單3.具體使用:
有了以上兩步, 就可以簡單的通過設置變量s_pModelessLayer 進行模態對話框的操作了,如果想做的更OO一些,則可以建立一個自己的CCLayer子類, 並加入一個DoModal()方法,進行一次封裝便可以了, 然後在關閉窗口的地方把s_pModelessLayer設置成空就可以了。