我已经创建了一个SKSpriteNode子类。我将该类的实例与SKPhysicsJointLimit类型的连接连接起来。我在我的didEndContact(联系人: SKPhysicsContact)的GameScene中这样做:
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()语句和消息"Swift动态强制转换失败“之后调用该方法失败。我非常感谢你对如何使用SKPhysicsBody的共同财产的意见。更具体地说:如何使用(cast?)数组中的项,以便能够从场景的SKPhysicsWorld中删除它们。
发布于 2014-12-26 00:47:18
我花了更多时间调查这件事。这就是我想出来的:
我决定在我的SKSpriteNode子类中添加一个属性,并自己管理连接。
var joints: [SKPhysicsJointLimit]
override init(){
...
self.joints = []
...
}每次我向场景的SKPHysicsWorld添加一个连接时,我也会将它添加到SKNNode本身的joints数组中。当迭代SKPHysicsBody的cast失败(参见问题)时,我想将它转换为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)
}
}这似乎不是最优雅的工作方式,因为已经有一个框架管理数组,承诺是相同的事情。但我无法利用它,这是暂时可行的。
https://stackoverflow.com/questions/27649362
复制相似问题