【发布时间】:2016-01-14 16:08:57
【问题描述】:
我开始学习 Swift2 以使用 SpriteKit 在 iOS 上进行开发,但我似乎无法检测到我是否触摸了 Sprite 的可见部分。
我可以像这样找到哪个节点被触摸:
let touchedNode = self.nodeAtPoint(location)
但这会检测到精灵上的触摸。我只想检测精灵的“不透明”部分的触摸。
我尝试创建一个带有 alpha 掩码边界框的 PhysicsBody 并测试我选择的节点的边界框是否包含触摸的位置,如下所示:
sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size)
sprite.physicsBody?.affectedByGravity = false
if (touchedNode.containsPoint(location)){
但这没有帮助。如果我点击精灵的透明部分,事件仍然会触发。
文档说“创建了一个新的物理体,其中包括纹理中具有非零 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)
但是即使我在边界框之外触摸,这仍然会打印节点的名称,这对我来说毫无意义。
谢谢你的帮助。
【问题讨论】:
-
您找到了这样做的好方法吗?
标签: ios swift sprite-kit swift2 bounding-box