private:
map<CCObject*, bool> enableTable;
public:
void setDisableWithRunningScene()
{
CCScene* runningScene = CCDirector::sharedDirector()->getRunningScene();
_setDisableWithRunningScene(runningScene);
}
void restoreDisable()
{
for(auto iter = enableTable.begin(); iter != enableTable.end(); ++iter)
{
CCMenuItem* menuItem = dynamic_cast<CCMenuItem*>(iter->first);
if(menuItem)
{
menuItem->setIsEnabled(iter->second);
}

CCLayer* someLayer = dynamic_cast<CCLayer*>(iter->first);




if(someLayer)
{
someLayer->setIsTouchEnabled(iter->second);
}
}
}
private:
void _setDisableWithRunningScene(CCNode* node)
{
CCMenuItem* menuItem = dynamic_cast<CCMenuItem*>(node);
if(menuItem)
{
enableTable[menuItem] = menuItem->getIsEnabled();
menuItem->setIsEnabled(false);
}
CCLayer* someLayer = dynamic_cast<CCLayer*>(node);
if(someLayer)
{
enableTable[someLayer] = someLayer->getIsTouchEnabled();
someLayer->setIsTouchEnabled(false);
}
if(node->getChildrenCount())
{
CCArray* children = node->getChildren();
for(int i=0; i<children->count(); i++)
{
_setDisableWithRunningScene((CCNode*)children->objectAtIndex(i));
}
}
}
_setDisableWithRunningScene 안에 들어가는 인자를 포함해서 아래 child 탐색하면서 모두 터치 불가능하게 만듭니다.

그리고 restore 하시면 기억한 정보를 바탕으로 다시 터치 유/무 를 복구시킵니다.

restore 시, 사라진 객체에 대한 처리는 없습니다. 예외 처리를 하실 일 있으면 직접 하셔야 합니다~~

그리고 restore 로 복구 하시면 됩니다. 자체 AlertView 만드시는 분들이나 팝업창 만들고 다른것 클릭 안되게 하실 분 쓰시면 유용합니다.

 


좋은 정보 공유감사합니다.

그런데 alertview같은 팝업을 띄우고, 그 뒤의 화면에 대한 터치를 막으려면 저 방법보다는 

alertview 클래스에서 touch를 등록할때 standard touch가 아닌, targeted touch로 등록을 하면 간단하게 됩니다.

targeted touch를 등록할 때 swallow(다른 터치를 꿀꺽 삼킬지 여부) 인자를 넣어주는 부분이 있습니다.^^

 


그런식으로 하면 CCMenu 를 이용한 터치는 어떻게 피할 수 있나요? 뒤에 깔린 CCMenuItem 터치는 피할 수 없던데요

 


touch priority를 -128보다 작은 값으로 주세요.

CCMenu의 touch priority가 -128이기 때문에 그것보다 작은 값을 사용하면 먼저 터치를 처리할 수 있습니다. 

'Cocos2Dx' 카테고리의 다른 글

pugixml cocos2d-x  (0) 2013.10.09
CCScrollView 사용법  (0) 2013.08.10
Sprite 텍스처 교체  (0) 2013.06.06
cocos2dx android 프로젝트 생성 시 오류 해결 법.  (0) 2013.06.01
CCLog 한글 출력 가능하게 만들기  (0) 2013.06.01
Posted by maysent
: