编辑:Apple在iOS8中修复了此问题,因此肯定不是预期/预期的,而是一个bug。
看起来zPosition
在用于渲染节点时与用于确定触摸哪个节点时的解释不同。
当我创建父节点和子节点的层次结构时(都设置了zPosition),用于渲染的最顶层节点由通向该节点的所有zPosition的总和确定,因此可以交错来自不同父节点的节点。
但是,在确定用于接收触摸的最高节点时,zPosition仅用于区分同一父级的同级,当节点具有不同的父级时,其父级z顺序优先。 (一个父母的所有孩子都在另一父母的节点之下或之上)
为了说明这一点,一些带有结果的示例代码:
#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
在注释掉zPosition行的情况下运行时,将得到以下结果:
如预期的那样,首先渲染container1(带有黄色和红色正方形),并在顶部渲染container2(带有蓝色正方形),因此红色正方形被隐藏了。
在黄色“边界”内单击时,输出为
yellow hit
,在蓝色方形印刷品blue hit
内单击,均符合预期。但是,当插入zPosition行时,将得到以下信息:
如您所见,container2的蓝色方块与container1的两个方块交错,但是当您在红色方块内部单击时,会得到
blue hit
!当确定哪个节点最适合触摸时,container2中的所有内容仍在container1上方。
这是预期的行为吗?如果是这样,是否有一种通用的方法来解决这个问题而不失理智?
最佳答案
我不知道自您发布以来是否有任何更改,或者您只是做错了什么,但就我而言,它确实有效。
我只是将您的代码复制粘贴到一个新项目中并进行了测试。
如果红色方块在顶部,我会被击中,如果蓝色方块在顶部,我会得到蓝色。
关于ios - 在SpriteKit中,zPosition如何用于渲染和 HitTest ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24245494/