gpt4 book ai didi

ios - 在 SpriteKit 中,zPosition 如何用于渲染和 HitTest ?

转载 作者:行者123 更新时间:2023-11-29 02:53:09 24 4
gpt4 key购买 nike

编辑:苹果在 iOS8 中修复了这个问题,所以这当然不是预期/有意的,而是一个错误。

似乎 zPosition 在用于渲染节点时与在用于确定哪个节点被触摸时的解释不同。

当我创建父节点和子节点的层次结构(都设置了 zPosition)时,用于渲染的最顶层节点由通向该节点的所有 zPosition 的总和决定,因此来自不同父节点的节点可以交错。
然而,在确定接收触摸的最顶层节点时,zPosition 仅用于区分同一父节点的兄弟节点,当节点具有不同的父节点时,其父节点 z-order 优先。 (一个父节点的所有子节点都在另一个父节点的节点下方或上方)

为了说明,一些带有结果的示例代码:

#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 行的情况下运行时,您会得到以下结果:
without zPosition

正如预期的那样,首先渲染了 container1(带有黄色和红色方 block ),然后在顶部渲染了 container2(带有蓝色方 block ),因此红色方 block 被隐藏了。在黄色“边框”内单击时,输出为 yellow hit,在蓝色正方形内单击会打印 blue hit,一切如预期。

然而,当插入 zPosition 行时,您会得到以下内容:
with zPosition

如您所见,container2 的蓝色方 block 与 container1 的两个方 block 交织在一起,但是当您在红色方 block 内部单击时,您会得到blue hit!
在确定哪个节点是最顶部的触摸时,container2 中的所有内容仍在 container1 之上。

这是预期的行为吗?如果是这样,是否有一种通用的方法可以在不失去理智的情况下处理这个问题?

最佳答案

我不知道自您发帖后是否发生了任何变化,或者您是否做错了什么,但就我而言,它奏效了。

我只是将您的代码复制粘贴到一个新项目中并对其进行了测试。

如果红色方 block 在顶部,我会得到红色命中;如果蓝色方 block 在顶部,我会得到蓝色方 block 。

enter image description here

enter image description here

关于ios - 在 SpriteKit 中,zPosition 如何用于渲染和 HitTest ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24245494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com