小编Shu*_*060的帖子

错误:使用兄弟节点和Sprite Kit中的userInteractionEnabled属性进行命中测试

当兄弟姐妹重叠时,错误 - 命中测试无法正常工作:

场景中有2个重叠节点具有相同的父节点(即兄弟节点)

最顶层的节点具有userInteractionEnabled = NO另一个节点userInteractionEnabled = YES.

如果触摸了重叠,则在最顶层节点被命中测试并且失败(因为userInteractionEnabled = NO)之后,而不是底部节点是下一个被命中测试的节点,它被跳过并且2个兄弟节点的父节点被命中测试.

应该发生的是,下一个兄弟(底部节点)是经过重击测试而不是命中测试跳到父节点.

根据Sprite Kit文档:

"在场景中,当Sprite Kit处理触摸或鼠标事件时,它会遍历场景以找到想要接受事件的最近节点.如果该节点不想要事件,Sprite Kit会检查下一个最近的节点,所以处理命中测试的顺序基本上与绘制顺序相反.对于在命中测试期间要考虑的节点,其userInteractionEnabled属性必须设置为YES.除场景外的任何节点的默认值为NO节点."


这是一个错误,因为节点的兄弟姐妹在他们的父母之前呈现 - 兄弟姐妹应该是下一个被测试的,而不是它的父母.此外,如果一个节点有userInteractionEnabled = NO,那么肯定它应该是'透明'的关于命中测试 - 但是这不是因为它导致行为的改变,因为在测试中跳过了一个节点.

我在网上搜索过,但找不到任何人报告或发布此错误.我应该报告这个吗?


然后我在这里发布这个的原因是因为我想要一个关于这个bug的'修复'的建议(即建议在某处实现某些代码,以便SpriteKit以'预期'方式工作-testing)


复制错误:

使用在Xcode中启动新的"游戏"项目时提供的"Hello World"模板(它具有"Hello World"并在您单击时添加火箭精灵).

可选:[我还从项目中删除了火箭精灵图像,因为X当找不到图像时出现的矩形更容易用于调试,可视化]

将SKSpriteNode添加到场景中userInteractionEnabled = YES(我将从现在开始将其称为节点A).

运行代码.

您会注意到,当您单击节点A时,不会生成火箭精灵.(自命中测试成功后应该停止的预期行为 - 它在节点A上成功时停止)

但是,如果你在节点A旁边产生一些火箭,然后点击节点A和火箭重叠的地方,那么就有可能在节点A上产生另一个火箭 - 但这不可能.这意味着在最顶层节点(userInteractionEnabled = NO默认情况下为火箭)上的命中测试失败后,它不再测试下一个节点A,而是测试火箭的父节点,而不是场景.


注意:我使用的是Xcode 7.3.1,Swift,iOS - 我还没有测试过这个bug是否具有通用性.


额外的细节:我做了一些额外的调试(上面的复制有轻微的复杂性),并确定命中测试后来发送给父母,因此不一定是场景.

touch hittest sprite-kit sknode swift

7
推荐指数
1
解决办法
540
查看次数

For-in循环和类型转换仅适用于匹配类型的对象

我在这里看到解释如何告诉编译器数组在循环中是某种类型的答案.

但是,Swift是否提供了一种方法,以便循环只循环遍历数组中指定类型的项而不是崩溃或根本不执行循环?

casting for-in-loop swift

4
推荐指数
1
解决办法
3064
查看次数

标签 统计

swift ×2

casting ×1

for-in-loop ×1

hittest ×1

sknode ×1

sprite-kit ×1

touch ×1