我开始学习 Swift2 以使用 SpriteKit 在 iOS 上进行开发,但我似乎无法检测到我是否触摸了 Sprite 的可见部分。
我可以这样找到哪个节点被触摸了:
let touchedNode = self.nodeAtPoint(location)
但这会检测 Sprite 上的触摸。我只想检测 Sprite “不透明”部分的触摸。
我尝试创建一个带有 alpha mask 边界框的 PhysicsBody,并测试我选择的节点的边界框是否包含触摸位置,如下所示:
sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size)
sprite.physicsBody?.affectedByGravity = false
if (touchedNode.containsPoint(location)){
但这并没有帮助。如果我点击 Sprite 的透明部分,该事件仍会触发。
文档说“创建了一个新的物理体,其中包括纹理中具有非零 alpha 值的所有纹素。”,所以它不应该工作吗?
感谢您的宝贵时间。
PS:我也尝试在我的 alpha 阈值上更加慷慨,但这也没有用(以防我的透明度不完美)。
更新:
为了添加更多细节,我正在构建一个关卡编辑器。这意味着我将根据用户的选择创建许多节点,并且我需要能够选择/移动/旋转/等等这些节点。我实际上使用的是 SKSpriteNodes,因为我的 PNG 图片会以这种方式自动添加到 xcassette 中。我决定使用 PhysicsBody 的 Alpha Mask 边界框,因为当您选择一个节点时,该值会显示在场景编辑器 (Xcode) 中,并且当您选择节点时,Alpha Mask 会准确突出显示我希望能够显示的 Sprite 部分检测内部触摸。
如果我使用了错误的想法/技术,请告诉我。这是可能的,因为我才刚刚开始使用 Swift 和 SpriteKit。
更新 2
我查询了 physicsWord(如推荐的那样)以获得正确的 physicsBody 并获得了附加节点的名称,如下所示:
let body = self.physicsWorld.bodyAtPoint(location)
print(body?.node?.name)
但是即使我在边界框外触摸,这仍然会打印节点的名称,这对我来说毫无意义。
无论如何,谢谢你的帮助。
最佳答案
SKPhysicsBody
没有定义 SKNode
的边界。您可以通过调用 bodyAtPoint
查询场景的 SKPhysicsWorld
来进行命中检查。这将返回您感兴趣的 SKPhysicsBody
。
关于ios - 使用 SpriteKit 检测 Sprite 边界框(alpha 蒙版)内的触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33161437/