我开始学习Swift 2在iOS上使用Spritekit进行开发,我似乎无法检测到我是否触摸了我的Sprite的可见部分。
我可以找到哪个节点被触动,如下所示:
let touchedNode = self.nodeAtPoint(location)
但是这检测到了sprite上的触摸。我想只检测sprite上“不透明”部分的触摸。
我试着创建一个带有alpha遮罩边界框的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遮罩会准确地高亮显示我的精灵中我希望能够检测到内部触摸的部分。
如果我使用了错误的想法/技术,请告诉我。这是可能的,因为我才刚刚开始使用Swift和SpriteKit。
更新2
我查询了physicsWord(按照建议)以获得正确的physicsBody,并获得了所连接节点的名称,如下所示:
let body = self.physicsWorld.bodyAtPoint(location)
print(body?.node?.name)
但是,即使我在边界框外触摸,这仍然会打印节点的名称,这对我来说毫无意义。
不管怎样,谢谢你的帮助。
2条答案
按热度按时间piah890a1#
SKPhysicsBody
并没有定义SKNode
的边界。你可以通过调用bodyAtPoint
来查询你场景的SKPhysicsWorld
来进行命中检查。这将返回你感兴趣的SKPhysicsBody
。7ajki6be2#
我也遇到了同样的问题。你实际上不能在Sprite节点的alpha遮罩上执行触摸,苹果文档中就有这样的说明。你必须使用复合框。我使用了一个形状节点,并将“线宽”改为0,这样复合框基本上是不可见的。确保复合框的Z轴更高,然后通过复合框形状节点(而不是原始节点)运行touch事件。