ios - 使用 SpriteKit 检测 Sprite 边界框(alpha 蒙版)内的触摸

标签 ios swift sprite-kit swift2 bounding-box

我开始学习 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/

相关文章:

iOS7:我们可以使用 Helvetica Neue 以外的动态类型字体吗?

ios - 我如何知道用户是否通过 iOS 上的应用内购买取消了自动续订订阅?

iphone - 我应该使用什么 OpenGL ES 纹理格式才能在 iPad 上获得更好的动态范围?

ios - 平滑路径角以与 SKAction followPath 一起使用

swift - Sprite 套件中弹丸的平滑过渡

ios - 在没有开发者注册的情况下转移应用程序?

swift - Google Maps iOS 不允许自定义 map 标记图像

swift - 默认参数swift

ios - 如果在其他类中实现,自定义点击识别器方法将不起作用

ios - 每 3 秒只注册一次用户的点击