错误 - 当兄弟节点重叠时,命中测试无法按预期工作:
我搜索了网络,但找不到任何人也报告或发布了这个错误。那么我应该报告这个错误吗?
然后我在这里发布这篇文章的原因是因为我想寻求对此错误的修复建议(即,在某些代码实现中提供一些建议,使SpriteKit在命中测试方面按照“预期”方式工作)。
要复制这个错误:
使用Xcode中启动新的“Game”项目时提供的“Hello World”模板(它有“Hello World”,并在单击时添加火箭精灵)。
可选:[我还从项目中删除了火箭精灵图像,因为当未找到图像时出现带有X的矩形更易于进行调试]
向场景添加一个SKSpriteNode,设置userInteractionEnabled = YES (从现在开始我将称其为节点A)。
运行代码。
您会注意到当您点击节点A时,不会产生任何火箭精灵。(由于命中测试应在成功后停止 - 当它成功地停在节点A上时,它也停止了。)
但是,如果您产生几个与节点A相邻的火箭,然后单击节点A和火箭重叠的地方,则可能在节点A上方再生成一个火箭 - 但这不应该是可能的。这意味着,在命中测试在最上面的节点(默认情况下具有userInteractionEnabled = NO的火箭)失败后,它不是测试下一个节点A,而是测试火箭的父节点,即Scene。
注意: 我使用的是Xcode 7.3.1、Swift、iOS——我还没有测试这个错误是否是通用的。
额外的细节: 我做了一些额外的调试(略微复杂化了上面的复制),并确定命中测试随后发送给了父级,而不一定是场景。
根据Sprite Kit文档:场景中有2个重叠的节点,它们拥有相同的父节点(即兄弟节点)
最上方的节点为
userInteractionEnabled = NO
,而另一个节点为userInteractionEnabled = YES
。如果重叠处被触摸,则在顶部节点被命中测试并失败(因为
userInteractionEnabled = NO
)后,应该命中测试下一个兄弟节点(即底部节点),而不是跳到这两个兄弟节点的父节点。此问题应该导致命中测试下一个兄弟节点(即底部节点),而不是跳到父节点。
这是一个错误,因为节点的兄弟节点比它们的父节点先呈现,所以在测试时应该测试下一个兄弟节点,而不是其父节点。此外,如果一个节点具有"在场景中,当Sprite Kit处理触摸或鼠标事件时,它会遍历场景以查找要接受事件的最近节点。如果该节点不想接受事件,则Sprite Kit会检查下一个最近的节点,依此类推。命中测试处理的顺序基本上与绘制顺序相反。 要考虑在命中测试期间,必须将其userInteractionEnabled属性设置为YES。对于任何节点,除了场景节点之外,默认值为NO。"
userInteractionEnabled = NO
,那么在命中测试方面它应该是“透明”的,但这里不是这样,因为它会导致在测试中跳过一个节点。我搜索了网络,但找不到任何人也报告或发布了这个错误。那么我应该报告这个错误吗?
然后我在这里发布这篇文章的原因是因为我想寻求对此错误的修复建议(即,在某些代码实现中提供一些建议,使SpriteKit在命中测试方面按照“预期”方式工作)。
要复制这个错误:
使用Xcode中启动新的“Game”项目时提供的“Hello World”模板(它有“Hello World”,并在单击时添加火箭精灵)。
可选:[我还从项目中删除了火箭精灵图像,因为当未找到图像时出现带有X的矩形更易于进行调试]
向场景添加一个SKSpriteNode,设置userInteractionEnabled = YES (从现在开始我将称其为节点A)。
运行代码。
您会注意到当您点击节点A时,不会产生任何火箭精灵。(由于命中测试应在成功后停止 - 当它成功地停在节点A上时,它也停止了。)
但是,如果您产生几个与节点A相邻的火箭,然后单击节点A和火箭重叠的地方,则可能在节点A上方再生成一个火箭 - 但这不应该是可能的。这意味着,在命中测试在最上面的节点(默认情况下具有userInteractionEnabled = NO的火箭)失败后,它不是测试下一个节点A,而是测试火箭的父节点,即Scene。
注意: 我使用的是Xcode 7.3.1、Swift、iOS——我还没有测试这个错误是否是通用的。
额外的细节: 我做了一些额外的调试(略微复杂化了上面的复制),并确定命中测试随后发送给了父级,而不一定是场景。
userInteractionEnabled
属性旨在表示与命中测试相关的透明度,而由于这种行为而失败了。 - Shuri2060