我有一些非完成的圆圈不断旋转,用户从圆圈转到圆圈。 我从场景中移除了所有重力,力等等
问题:我正在尝试进行命中检测,我只是检查用户的位置,以及在我的场景的物理世界中是否有SKNode的身体。如果它是形状的命中,则用户可以继续(图像A),但如果他在外面则失败(图像B)
尽管形状非常复杂,但scene.showPhysics似乎与我的形状完全匹配。 (见图A和B)
CountVectorizer(ngram_range=(1,2), binary =True, max_features = 5000)
打印
let updatedOrigin = user.calculateAccumulatedFrame().origin
user.scene?.physicsWorld.enumerateBodiesAtPoint(updatedOrigin, usingBlock: { (body, stop) in
print(" Shape contains \(body.node!.name)")
})
它可以正确打印用户和场景,但也可以打印周围所有圆形的形状,此时应该只有一个,或者没有。节点在那里,但物理物理不应该命中。
任何想法为什么它会显示所有圈子的匹配,只应匹配1或没有?谢谢!
编辑:其他信息
- 使用 Shape contains Optional("User")
Shape contains Optional("circle")
Shape contains Optional("circle")
Shape contains Optional("circle")
Shape contains Optional("circle")
Shape contains Optional("Scene")
时我得到了类似的结果
- 我正在使用CGPath创建旋转节点的PhysicsBody
答案 0 :(得分:2)
我创建了一个简单的测试项目,其中包含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
}
}
您还可以使用CGPath
测试某个点是否在CGPathContainsPoint
范围内。在这里,您需要迭代用于创建弧形物理实体的路径。下图显示了使用CGPathContainsPoint
而不是enumerateBodiesAtPoint
的测试项目的结果。您可能需要将测试点convertPoint
转换为适当的坐标空间,然后再将其传递给CGPathContainsPoint
。