【问题标题】:Detecting touch inside bounding box (alpha mask) of Sprite using SpriteKit使用 SpriteKit 检测 Sprite 边界框(alpha 掩码)内的触摸
【发布时间】: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


【解决方案1】:

SKPhysicsBody 没有定义SKNode 的边界。您可以通过调用bodyAtPoint 来查询场景的SKPhysicsWorld 来进行命中检查。这将返回您感兴趣的SKPhysicsBody

【讨论】:

  • 在我看来,这会避开房间里的大象。我做错了吗?从边界框(alpha 掩码)检测场景对象的触摸的良好做法是什么?我的意思是,该解决方案显然是针对我遇到的更基本问题的破解,不是吗?无论如何,感谢您的耐心等待。
  • 我编辑的答案更好,似乎是检测 SKSpriteNodes 触摸的“正确”方式
  • 嗯,我试过做“self.physicsWorld.bodyAtPoint(location)”,这会以完全相同的方式返回我的精灵,而不关心边界框,即使我的边界框是正确的(我可以通过移动对象对其进行测试,它使用我试图检测触摸的 alpha 蒙版边界框与其他对象正确碰撞)。
【解决方案2】:

我遇到了同样的问题。您实际上无法对 Sprite 节点的 alpha 蒙版执行触摸,它在 Apple 文档中正确说明。您必须使用复合框。我使用了一个形状节点并将“线宽”更改为 0,因此基本上复合框是不可见的。确保复合框的 Z 轴更高,然后通过复合框形状节点而不是原始节点运行触摸事件。

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多