편집 : 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
, 당신은 얻을 다음 결과 :
예상대로
먼저이 container1는 (노란색과 빨간색 사각형으로) 렌더링과 최고 컨테이너 2에있다가 (파란색 사각형으로) 렌더링되는, 그래서 빨간색 사각형이 숨겨됩니다. 노란색 '경계선'안쪽을 클릭하면 출력은 yellow hit
이고, 파란색 sqaure 내부를 클릭하면 blue hit
이 모두 예상대로 인쇄됩니다.
당신이 볼 수 있듯이, 컨테이너 2에서 파란색 사각형이 container1을, 두 사각형 끼어 들어 당신이 빨간색 사각형 내부를 클릭 할 때 다음 zPosition 라인 그러나 삽입하는 경우
, 당신은 다음과 같은 수 그러나, 당신은 blue hit
를 얻는다!
접촉을 위해 어느 노드가 최상위인지를 결정할 때 container2의 모든 것이 여전히 container1 위에 있습니다.
이 예상되는 동작입니까? 그렇다면, 정신병을 잃지 않고 이것을 처리 할 수있는 일반적인 방법이 있습니까?
나는 이것을 iOS 8.3에서 다시 시험해 보았고 당신 말이 맞습니다. 나는 iOS 7.1.2 장치에서 동일한 프로젝트를 재개했는데 빨간색 사각형이 표시 될 때 "파란색 충돌"이라고 표시되므로 iOS7을 실행하지 않는 시스템에서만 올바르게 작동합니다. 확인해 주셔서 감사합니다. – Pieter