2009-10-25 3 views
5

레이어에 많은 스프라이트가있는 게임을 만들고 스프라이트를 터치하면 어떤 작업이 수행됩니다.iphone z의 코코스 2D 주문

내 문제는 z 순서 문제이며, 대부분의 스프라이트가 겹쳐져 있고 겹치는 스프라이트를 터치하면 뒤에서 (가장 낮은 z 순서로 생각하면) 앞에있는 것 대신 반응합니다.

cocos2d의 z 순서에 대해 더 자세히 알아야합니다.

런타임시 z 순서를 어떻게 변경합니까?

감사합니다.

답변

2

0.8에 Touch Dispatcher를 사용하고 있습니까?

v0.7.x (표준) 또는 한 번 터치 할 때와 같은 터치 (대상)를 전달하는 싱글 톤. 타겟 접촉을 사용하면 얻을 수있는 이점은 사용자가 주장하는 터치의 이벤트 (시작, 이동, 종료, 취소) 만 수신한다는 것입니다. 타게팅 터치를 사용하면 멀티 터치 및 싱글 터치 게임에서 터치 핸들링 코드가 간단 해집니다. 복잡한 터치 핸들링 코드가 필요한 경우가 아니라면 Targeted touches를 사용하는 것이 좋습니다.

새로운 TouchDispatcher의 또 다른 이점은 우선 순위 대기열이있어서 터치 소비자의 위치를 ​​변경할 수 있다는 것입니다.

원하는 우선 순위 대기열을 사용할 수 있습니다. 각 스프라이트에 우선 순위를 설정하여 어느 스프라이트가 먼저 터치해야하는지 정의하고 해당 스프라이트에 터치를 전달하거나 삼켜야 할지를 정의 할 수 있으므로 처리 후 아무 것도 터치 이벤트를 얻지 못합니다. 당신은 터치 디스패처의 우선 순위를 설정할 수 있습니다 스프라이트 클래스의 onEnter 방법에 http://code.google.com/p/cocos2d-iphone/source/browse/trunk/tests/TouchesTest (특히 Paddle.m 클래스)

:

가적인 Cocos2D 프로젝트에 시험 예를 만지는

아마 가장 좋은 보는 곳입니다 :

- (void)onEnter 
{ 
    [[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 
    [super onEnter]; 
} 

우선 순위가 더 높은 대표는 우선 순위가 낮은 후보보다 먼저 응답합니다.

+1

실제로 우선 순위가 낮 으면 터치가 먼저 발생합니다. 0이 가장 낮지 않은 경우 0 이하로 이동할 수 있습니다. 우선 순위로 Z 순서를 사용하려면 Z 순서 * -1을 우선 순위로 사용하고 "가장 높은"Z 순서로 먼저 터치합니다. – nash

5

Z 주문 및 터치 처리 시스템은 별도입니다. Z 주문은 레이어의 시각적 인 레이아웃에만 해당됩니다. 그러나 터치 핸들링 시스템은 터치 디스패처에 등록 할 때 지정된 우선 순위에 의존합니다. 우선 순위가 동일한 터치 디스패처로 두 개의 레이어를 등록하면 레이어의 Z 순서에 관계없이 두 번째 레이어가 먼저 터치됩니다.

동일한 문제가있을 때 나를 혼란스럽게 여기는 부분이 있습니다. Z Order가 시각적으로 더 높은 숫자를 서로 겹치게하는 반면, 그것은 정확히 접촉의 반대입니다. 우선 순위 번호가 낮 으면 실제로 먼저 터치됩니다. 내 자신의 정신을 지키기 위해 필자는 필자의 코드를 리펙토링하여 가능할 때마다 Z 인덱스와 동일한 순서로 레이어를 추가 했으므로 맨 위 레이어의 접촉은 직관적으로 동작합니다.

이렇게 할 수없는 경우 터치 우선 순위 시스템을 사용하며 나중에 혼동하지 않도록 상수를 정의합니다.우선 순위 시스템을 사용하여 터치에 등록하려면, 다음을 사용 : 그것의

-(void) registerWithTouchDispatcher { 
[[TouchDispatcher sharedDispatcher] addTargetedDelegate:self priority: DEFAULT_TOUCH_PRIORITY swallowsTouches:YES]; 

}

0

생각을 종이의 층으로. 1이 0의 맨 위에 있습니다. 0은 -5 위의 어딘가에 있습니다. 16이 14보다 많습니다. 즉, 음수 또는 양수를 사용할지 여부에 관계없이 더 높은 숫자가 낮은 숫자 위에 올 수 있습니다.