2015-10-16 32 views
6

我开始学习使用SpriteKit在iOS上开发Swift2,并且我似乎无法检测到我是否触摸了我的Sprite的可见部分。使用SpriteKit检测Sprite内边界框(alpha掩码)内的触摸

我能找到这点很感动这样的:

let touchedNode = self.nodeAtPoint(location) 

但这种检测在精灵的触摸。我想检测只在精灵的“不透明”部分触摸。

我试图与阿尔法遮掩边框创建PhysicsBody和测试,如果我选择的节点的边界框包含触摸这样的位置:

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

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

文档中提到“创建了一个新的物理体,其中包含纹理中具有非零阿尔法值的所有纹理元素”,所以不应该有效吗?

谢谢你的时间。 PS:我也试图在我的alpha阈值上更加慷慨,但这也不起作用(如果我的透明度不够完美)。


UPDATE:

增添了几分更多的细节,我建立一个关卡编辑器。这意味着我将创建许多节点,具体取决于用户选择的内容,并且我需要能够选择/移动/旋转/等这些节点。我实际上使用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) 

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

谢谢你的帮助。

+0

您是否找到了一种很好的方法来做到这一点? – Confused

回答

2

SKPhysicsBody没有定义SKNode的界限。您可以通过查询bodyAtPoint来查询您场景的SKPhysicsWorld,从而完成命中检查。这将返回您感兴趣的SKPhysicsBody

+0

在我看来,这将避免在房间里的大象。我做错了吗?从边框(alpha蒙版)检测场景物体的触摸有什么好的做法?我的意思是,这个解决方案显然是围绕着一个更基本的问题进行破解,不是吗?无论如何,谢谢你的耐心。 –

+0

我编辑的答案是更好的,似乎是“正确”的方式来检测触摸SKSpriteNodes –

+0

哼,我试着做“self.physicsWorld.bodyAtPoint(位置)”,这返回我的精灵完全一样的方式,而不是关心即使我的边界框是正确的(我可以通过移动对象来测试它,它使用alpha掩码边界框正确地与其他对象碰撞,我试图检测触摸)。 –