2016-09-05 53 views
2

我有一些非完成的圆圈不断旋转,用户从圆圈转到圆圈。 我删除了所有的重力,部队等从我的场景SpriteKit:enumerateBodiesAtPoint不显示正确的物体

形象的 Image A

图像B Image B

问题:我试图做一个碰撞检测,我只是检查用户在哪里,如果在我的场景的物理世界的这一点上有SKNode的物体。如果它是一个形状的命中,用户可以继续(图像A),但如果他在外面(图像B)则失败(图像B)

虽然形状非常复杂,但scene.showPhysics似乎与我的形状精确匹配。 (见图片A和B)

let updatedOrigin = user.calculateAccumulatedFrame().origin 
     user.scene?.physicsWorld.enumerateBodiesAtPoint(updatedOrigin, usingBlock: { (body, stop) in 
      print(" Shape contains \(body.node!.name)") 
}) 

它打印

Shape contains Optional("User") 
Shape contains Optional("circle") 
Shape contains Optional("circle") 
Shape contains Optional("circle") 
Shape contains Optional("circle") 
Shape contains Optional("Scene") 

它正确打印用户和场景,还四处打印所有圆的形状,当应该只有一个在这一点上,或没有。节点在那里,但尸体物理不应该打。

任何想法为什么它显示所有这些圈子的命中时,它应该只匹配1或没有?谢谢!

编辑:附加信息 - 我使用的是CGPath创建我的旋转节点的

+0

你要发送错误报告或要这样呢? – 0x141E

+0

您是否知道iOS 10 GM中是否仍然存在这种情况?只要我尝试完成,会将答案标记为已解决。 –

回答

2

我创建了一个简单的测试项目,包含3个弧与物理场景中的PhysicsBody - 使用user.physicsBody?.allContactedBodies() 当我有类似的结果物体和3个矩形形状节点,用于识别每个弧的边界框。然后,我添加了一个触摸处理程序,在触摸点处放置一个小圆圈,并标识标识由触摸位置作为参数的enumerateBodiesAtPoint返回的节点。下图显示了场景中各个位置的敲击结果。

enter image description here

从测试结果来看,这不是明显的如何enumerateBodiesAtPoint确定是否物理学体包含指定点或没有。但很明显,该方法与其documentation不一致。我建议你避免在你的应用中使用它。

或者,你可以使用SpriteKit内置的接触检测:

class GameScene: SKScene, SKPhysicsContactDelegate { 
    override func didMoveToView(view: SKView) { 
     self.physicsWorld.contactDelegate = self 
    } 

    func didBeginContact(contact: SKPhysicsContact) { 
     // Handle contacts between physics bodies here 
    } 
} 

您还可以测试点是否使用CGPathContainsPoint一个CGPath内。在这里,你需要遍历你用来创建弧形物理实体的路径。下图显示了我的测试项目使用CGPathContainsPoint而不是enumerateBodiesAtPoint的结果。您可能需要将测试点(convertPoint)转换为适当的坐标空间,然后再将其传递至CGPathContainsPoint

enter image description here