编辑: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/

10-11 20:05