SpriteKit:enumerateBodiesAtPoint没有显示正确的实体

时间:2016-09-05 00:44:59

标签: ios sprite-kit skphysicsbody sknode

我有一些非完成的圆圈不断旋转,用户从圆圈转到圆圈。 我从场景中移除了所有重力,力等等

图片A. Image A

图片B Image B

问题:我正在尝试进行命中检测,我只是检查用户的位置,以及在我的场景的物理世界中是否有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

1 个答案:

答案 0 :(得分:2)

我创建了一个简单的测试项目,其中包含3个带有物理实体的圆弧和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
    }
}

您还可以使用CGPath测试某个点是否在CGPathContainsPoint范围内。在这里,您需要迭代用于创建弧形物理实体的路径。下图显示了使用CGPathContainsPoint而不是enumerateBodiesAtPoint的测试项目的结果。您可能需要将测试点convertPoint转换为适当的坐标空间,然后再将其传递给CGPathContainsPoint

enter image description here