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

Dav*_*d G 6 bounding-box ios sprite-kit swift swift2

我开始学习使用SpriteKit在iOS上开发Swift2,我似乎无法检测到我是否触及了我的Sprite的可见部分.

我可以找到这样触摸的节点:

let touchedNode = self.nodeAtPoint(location)  
Run Code Online (Sandbox Code Playgroud)

但这会检测精灵上的触摸.我想检测精灵的"不透明"部分的触摸.

我尝试使用alpha蒙版边界框创建一个PhysicsBody,并测试我选择的节点的边界框是否包含触摸的位置,如下所示:

sprite.physicsBody = SKPhysicsBody.init(texture: sprite.texture!, size: sprite.size)
sprite.physicsBody?.affectedByGravity = false
if (touchedNode.containsPoint(location)){
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.如果我点击我的精灵的透明部分,该事件仍会触发.

文档说"创建了一个新的物理体,其中包含纹理中具有非零alpha值的所有纹素.",所以不应该有效吗?

谢谢你的时间.

PS:我也试图在我的阿尔法阈值上更加慷慨,但这也没有用(如果我的透明度并不完美).


更新:

为了添加更多细节,我正在构建一个关卡编辑器.这意味着我将根据用户选择的内容创建许多节点,并且我需要能够选择/移动/旋转/等等这些节点.我实际上正在使用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)
Run Code Online (Sandbox Code Playgroud)

但即使我在边界框外触摸,这仍然是打印节点的名称,这对我来说没有意义.

无论如何,谢谢你的帮助.

Goo*_*oug 2

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