7

我创建了 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 中删除它们。

4

1 回答 1

3

我花了一点时间来调查这个。这就是我想出的:

我决定向我的 SKSpriteNode 子类添加一个属性并自己管理关节

    var joints: [SKPhysicsJointLimit]
override init(){
    ...
    self.joints = []
    ...
}

每次我向场景的 SKPHysicsWorld 添加一个关节时,我也会将它添加到 SKNNode 本身的关节数组中。虽然在我想将其转换为 SKPhysicsJoint 时迭代 SKPHysicsBody 的关节阵列失败(请参阅问题),但在迭代 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)
    }
}

这似乎不是完成这项工作的最优雅的方式,因为已经有一个框架管理的数组承诺是同一件事。但我无法使用它,这暂时有效。

于 2014-12-26T00:47:18.360 回答