我有几个未完成的圆圈不断旋转,一个用户从一个圆圈转到另一个圆圈。我从我的场景中移除了所有的重力,力等等。
图A
图B
问题:我正在尝试做一个命中检测,我只是检查用户在哪里,以及在我的场景的物理世界中是否存在SKNode的身体。如果它与形状匹配,则用户可以继续(图A),但如果他在外面,则失败(图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或者不匹配时,它会对所有的圆圈显示命中吗?谢谢!
编辑:其他信息-我在使用user.physicsBody?.allContactedBodies()
时得到了类似的结果-我正在使用CGPath创建旋转节点的PhysicsBody
发布于 2016-09-06 04:38:25
我用一个场景创建了一个简单的测试项目,其中包含3个带物理实体的圆弧和3个矩形形状节点,这些节点识别每个圆弧的边界框。然后,我添加了一个触摸处理程序,它在点击点处放置了一个小圆圈,并添加了一个标签来标识enumerateBodiesAtPoint
返回的节点,并将触摸位置作为参数。下图显示了在场景中不同位置轻拍的结果。
从测试结果来看,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
的结果。在传递给CGPathContainsPoint
之前,您可能需要使用convertPoint
将测试点转换为适当的坐标空间。
https://stackoverflow.com/questions/39322681
复制