2014-06-16 9 views
0

편집 : Apple은 iOS8에서이 문제를 해결 했으므로 예상되지는 않았지만 의도하지는 않았지만 버그였습니다.SpriteKit에서 zPosition은 렌더링 및 히트 테스트에 어떻게 사용됩니까?

zPosition은 어떤 노드가 접촉되었는지를 결정하는 데 사용될 때 노드를 렌더링하는 데 사용될 때 다르게 해석됩니다.

부모와 자식 노드의 계층 구조를 모두 만들면 (zPosition이 모두 설정 됨) 렌더링을위한 최상위 노드는 노드로 연결되는 모든 zPosition의 합계에 의해 결정되므로 다른 부모의 노드를 인터리브 할 수 있습니다.
그러나 접미사를 수신 할 최상위 노드를 결정할 때 zPosition은 동일한 부모의 형제를 구별하는 데에만 사용됩니다. 노드가 다른 부모를 가지면 부모 z 순서가 우선합니다.

는 설명하기 위해, 결과 일부 샘플 코드 (한 부모의 모든 차일 아래에 또는 다른 부모의 노드 위에 모두) :

주석 zPosition 라인을 실행
#import "MyScene.h" 

@interface NodeWithHitTest : SKSpriteNode 
-(instancetype)initWithColor:(UIColor *)color size:(CGSize)size; 
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end 


@implementation NodeWithHitTest 
-(instancetype)initWithColor:(UIColor *)color size:(CGSize)size { 
    self = [super initWithColor:color size:size]; 
    self.userInteractionEnabled = YES; 
    return self; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"%@ hit", self.name); 
} 
@end 

@implementation MyScene 

-(id)initWithSize:(CGSize)size {  
    if (self = [super initWithSize:size]) { 
     SKNode* container1 = [SKNode new]; 
     SKNode* container2 = [SKNode new]; 
     NodeWithHitTest* sprite1 = [NodeWithHitTest spriteNodeWithColor:[UIColor yellowColor] size:CGSizeMake(200, 200)]; 
     sprite1.name = @"yellow"; 
     sprite1.position = CGPointMake(self.size.width/2, self.size.height/2); 
     NodeWithHitTest* sprite2 = [NodeWithHitTest spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(150, 150)]; 
     sprite2.name = @"blue"; 
     sprite2.position = sprite1.position; 
     NodeWithHitTest* sprite3 = [NodeWithHitTest spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(100, 100)]; 
     sprite3.name = @"red"; 
     sprite3.position = sprite1.position; 

     [container1 addChild:sprite1]; 
     [container1 addChild:sprite3]; 
     [container2 addChild:sprite2]; 

     [self addChild:container1]; 
     [self addChild:container2]; 
//  sprite1.zPosition = 1; 
//  sprite2.zPosition = 2; 
//  sprite3.zPosition = 3; 
    } 
    return self; 
} 

@end 

, 당신은 얻을 다음 결과 :
예상대로 without zPosition

먼저이 container1는 (노란색과 빨간색 사각형으로) 렌더링과 최고 컨테이너 2에있다가 (파란색 사각형으로) 렌더링되는, 그래서 빨간색 사각형이 숨겨됩니다. 노란색 '경계선'안쪽을 클릭하면 출력은 yellow hit이고, 파란색 sqaure 내부를 클릭하면 blue hit이 모두 예상대로 인쇄됩니다.
with zPosition

당신이 볼 수 있듯이, 컨테이너 2에서 파란색 사각형이 container1을, 두 사각형 끼어 들어 당신이 빨간색 사각형 내부를 클릭 할 때 다음 zPosition 라인 그러나 삽입하는 경우

, 당신은 다음과 같은 수 그러나, 당신은 blue hit를 얻는다!
접촉을 위해 어느 노드가 최상위인지를 결정할 때 container2의 모든 것이 여전히 container1 위에 있습니다.

이 예상되는 동작입니까? 그렇다면, 정신병을 잃지 않고 이것을 처리 할 수있는 일반적인 방법이 있습니까?

답변

1

게시물 이후로 변경된 사항이 있는지 또는 방금 잘못 처리 한 것인지 모르겠지만 제 경우에는 효과가있었습니다.

새로운 프로젝트에 코드를 복사하여 테스트 해보았습니다.

파란색 사각형이 맨 위에 있으면 빨간색 사각형이 맨 위에 있으면 파란색 사각형이 나타납니다.

enter image description here

enter image description here

+0

나는 이것을 iOS 8.3에서 다시 시험해 보았고 당신 말이 맞습니다. 나는 iOS 7.1.2 장치에서 동일한 프로젝트를 재개했는데 빨간색 사각형이 표시 될 때 "파란색 충돌"이라고 표시되므로 iOS7을 실행하지 않는 시스템에서만 올바르게 작동합니다. 확인해 주셔서 감사합니다. – Pieter

0

예, 이것은 예상되는 동작입니다. 그리기 및 터치의 z- 위치는 동일하지 않습니다. 드로잉을위한 전역 z- 위치와 같은 것이 있지만, 터치 된 노드를 결정하기위한 것은 부모 (및 그들의 z- 관계)와 관련이 있습니다.

+0

이 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남기십시오. 자신의 게시물에 언제나 댓글을 달 수 있으며 충분한 [평판] (http://stackoverflow.com/help/whats-reputation)을 갖게되면 [모든 게시물에 댓글을 달 수] 있어야합니다 (http : // stackoverflow.com/help/privileges/comment). – chopper

+0

의도 된 작동 소스가 있습니까? 빨간색 사각형을 두드리는 것이 파란색 사각형의 탭으로 해석되는 것은 매우 이상하고 직관력이 없습니다. – Pieter

+0

@chopper : 시스템을 잘못된 방식으로 사용하여 죄송합니다. 원래 게시물에 댓글을 달았으며 대답이 제공되지 않아야합니다. Pieter : 나는 내 자신의 프로젝트에서 여러 시간의 시행 착오 끝에 이것을 발견했다. 그리고 맞습니다. 반 직관적입니다. 이 방법으로 믿어지는 유일한 이유는 다른 종류의 SKNode (SKEffectNodes 및 SKCropNodes와 같은)를 사용하기 시작하면 'z 축 순서 그리기'와 '터치 z 순서'가 다르다는 것입니다. 그러나 이것은 지식이 아니라 추측 일뿐입니다. – Ralf