我创建了一个SKSpriteNode的子类。我将该类的实例与SKPhysicsJointLimit类型的关节连接在一起。我在我的GameScene中的didEndContact(联系方式:SKPhysicsContact)中执行此操作:
var joint = SKPhysicsJointLimit.jointWithBodyA(contact.bodyA, bodyB: contact.bodyB, anchorA: pos1!, anchorB: pos2!)
self.physicsWorld.addJoint(joint)
到目前为止效果很好。 然后我来到了我想要从关节中释放节点的地步。 According to the SKPhysicsBody docs there is a property called "joints" which is an array holding SKPhysicsJoint objects.我认为这正是我所需要的,但我无法迭代实例的关节并将它们从physicsWorld中删除。为了完成这项工作,我在自定义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()语句之后调用方法失败,消息&#34; Swift动态强制转换失败&#34;。我非常感谢您对如何使用SKPhysicsBody联合财产的看法。更具体地说:如何使用(强制转换?)数组中的项目,以便能够从场景的SKPhysicsWorld中删除它们。
答案 0 :(得分:3)
我花了一点时间来调查这个。这就是我想出的:
我决定在我的SKSpriteNode子类中添加一个属性并自己管理关节
var joints: [SKPhysicsJointLimit]
override init(){
...
self.joints = []
...
}
每当我向场景的SKPHysicsWorld添加一个关节时,我也将它添加到SKNNode本身的关节数组中。虽然迭代SKPHysicsBody的关节 - 阵列失败(请参阅问题)我希望将其投射到SKPhysicsJoint,但在迭代SKPhysicsJointLimit项目数组时,从物理世界中删除项目的工作原理如下:
func freeJoints(world: SKPhysicsWorld){
for item in self.joints{
println("removing item from physics world \(item)")
world.removeJoint(item)
}
self.joints.removeAll(keepCapacity: false)
}
}
这似乎不是最优雅的工作方式,因为已经有一个框架托管数组,它承诺是同样的事情。但是我无法利用它,现在这种情况有效。