cocos2d-x는 m_pTargetedHandlers, m_pStandardHandlers 이 두가지로 터치을 관리한다.



m_pTargetedHandlers 는 직접 터치이벤트을 받을 타켓이 모여있는 집합이고

m_pStandardHandlers 는 CCLayer들이 모여 있는 집합이다.


m_pTargetedHandlers  여기에 셋팅하는 방법은
CCTouchDispatcher* touchDispatcher = CCDirector::sharedDirector()->getTouchDispatcher();
if(touchDispatcher){
CCTouchHandler* handler = touchDispatcher->findHandler(this);

//if is not already added to the touch dispatcher - then lets add it
if(!handler){
touchDispatcher->addTargetedDelegate( tCCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches );
}
}

m_pStandardHandlers 에 셋팅하는 방법은
CCLayer에서 setTouchEnabled( true ) 이 함수만 실행 해주면 된다.

터치 이벤트 순서는

m_pTargetedHandlers  1

m_pStandardHandlers  2




터치 이벤트가 들어오면 터치 핸들러에 등록된 순서대로 아래 그림과 같이 번호가 적힌 대로 터치 이벤트를 발생 시켜 준다.


위에가 지금 보여지고 있는 레이어상에 등록된 모든 터치 이벤트라고 생각하고

지금 레이어 위에 새로운 레이어(팝업창)을 띄워 보자 그 새로운 레이어에는 총 4가지의 터치 이벤트가 있다고 생각하면

아래와 같은 그림처럼 되어 있을 것이다. 

따로 터치 가중치를 안주면 처리 방식은 스택형식으로 된다.





이제 우리가 원하는거는 Layer_2(팝업창)에만 터치 이벤트를 받아오게 하고 싶은 것이다.

이것을 하기 위해선 세가지 조건을 충족 시켜야한다.


첫쨰

touchDispatcher->addTargetedDelegate( tCCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches );

여기 함수에서 bool bSwallowsTouches 이 속성이 있는데 여기에 ture을 주면 된다.


둘째 

이타겟은 충돌범위는 화면 전체를 가지고 있거나 터치다운 이벤트 시  무조건 true값을 넘겨줘야 한다.


셋째 

bool bSwallowsTouches 이 속성을 줄 녀석은 팝업창 등록 시 맨 처음 등록 되는 타겟에 셋팅이 들어가야한다.

무슨 말이냐면 레이어2번에는 총 4개의 터치 이벤트가 있는데 따로 터치 가중치를 안주면 첫번째로 등록 시킨

터치 이벤트는 4번째로 터치 이벤트를 받게 된다.


이렇게 되면 Layer2(팝업창)에만 터치이벤트를 받을 수 있게 된다.







Posted by 부우산사나이
: