cocos2d. Как создать всплывающее модальное диалоговое окно (с CCLayer) - PullRequest
2 голосов
/ 29 сентября 2011

Мне нужно сделать модальное диалоговое окно (унаследованное от CCLayer), которое отображается в центре основного слоя. Пока он отображается, вы не можете нажать любую другую кнопку за пределами диалога. Как обычное модальное окно в системе MS Windows.

Проблема в том, что я не могу понять, как отключить сенсорные события основного слоя, пока отображается диалоговое окно.

Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Просто установите

self.isTouchEnabled = NO;

в основном слое, пока отображается всплывающее окно. Затем позже установите его обратно в ДА.

0 голосов
/ 17 ноября 2012

Это работает для меня в Cocos2d-x, но может быть адаптировано и для Cocos2d.

Я изменил setParent на:

virtual void setParent(CCNode* parent)
{
    CCLayerColor::setParent(parent);        

    if (parent)
    {
        saveTouchesRecursive(parent);

        for (unsigned int i=0; i<mSavedTouches.size(); i++)
        {
            CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(mSavedTouches[i]);
        }
    }
    else
    {
        for (unsigned int i=0; i<mSavedTouches.size(); i++)
        {
            CCStandardTouchDelegate* standardTouchDelegate =  dynamic_cast<CCStandardTouchDelegate*>(mSavedTouches[i]);
            CCTargetedTouchDelegate* targetedTouchDelegate =  dynamic_cast<CCTargetedTouchDelegate*>(mSavedTouches[i]);

            CCLayer* layer =  dynamic_cast<CCLayer*>(mSavedTouches[i]);

            if (layer)
            {
                layer->registerWithTouchDispatcher();
            }
            else if (standardTouchDelegate)
            {
                CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(mSavedTouches[i], 0);
            }
            else if (targetedTouchDelegate)
            {
                CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(mSavedTouches[i], 0,  false);
            }
            else
            {
                CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(mSavedTouches[i], 0,  false);
            }
        }
    }
}

И добавил следующий рекурсивный код для сохранениякоснитесь делегатов, чтобы я мог восстановить их после закрытия диалогового окна:

std::vector<CCTouchDelegate*> mSavedTouches;
void saveTouchesRecursive(CCNode* node)
{
    if (node != this)
    {    
        CCTouchDelegate* touchDelegate = dynamic_cast<CCTouchDelegate*>(node);
        if (touchDelegate)
        {
            CCTouchHandler* handler = CCDirector::sharedDirector()->getTouchDispatcher()->findHandler(touchDelegate);

            if (handler)
            {
                mSavedTouches.push_back(touchDelegate);
             }
        }

        for (unsigned int i=0; i<node->getChildrenCount(); i++)
        {
            CCNode* childNode = dynamic_cast<CCNode*>(node->getChildren()->objectAtIndex(i));

            if (childNode)
            {
                saveTouchesRecursive(childNode);
            }
        } 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...