我创建了 SKSpriteNode 的子类。我将该类的实例与 SKPhysicsJointLimit 类型的关节连接在一起。我在我的 GameScene 中的 didEndContact(contact: SKPhysicsContact) 中执行此操作:
var joint = SKPhysicsJointLimit.jointWithBodyA(contact.bodyA, bodyB: contact.bodyB, anchorA: pos1!, anchorB: pos2!)
self.physicsWorld.addJoint(joint)
到目前为止,这运作良好。然后我到了我想从关节中释放节点的地步。根据 SKPhysicsBody 文档,有一个名为“joints”的属性,它是一个包含 SKPhysicsJoint 对象的数组。我认为这正是我所需要的,但我无法遍历实例的关节并将它们从物理世界中删除。为了完成这项工作,我在我的自定义 SKSpriteNode 子类中添加了一个方法。
func freeJoints(world: SKPhysicsWorld){
if let joints = self.physicsBody?.joints {
for joint in joints{
println("found a joint: \(joint)")
// example print:
//found a joint: <PKPhysicsJointRope: 0x7fbe39e95c50>
world.removeJoint(joint as SKPhysicsJoint)
}
}
}
在 println() 语句后调用该方法失败,并显示消息“Swift dynamic cast failed”。我非常感谢您对如何使用 SKPhysicsBody 的共同财产提出意见。更具体地说:如何使用(投射?)数组中的项目,以便能够从场景的 SKPhysicsWorld 中删除它们。