SKSpriteNode のサブクラスを作成しました。そのクラスのインスタンスを SKPhysicsJointLimit 型のジョイントと一緒に接続します。GameScene の didEndContact (連絡先: SKPhysicsContact) 内でこれを行います。
var joint = SKPhysicsJointLimit.jointWithBodyA(contact.bodyA, bodyB: contact.bodyB, anchorA: pos1!, anchorB: pos2!)
self.physicsWorld.addJoint(joint)
これはこれまでのところうまくいきます。次に、ノードをジョイントから解放したいところまで来ました。SKPhysicsBody docs によると、SKPhysicsJoint オブジェクトを保持する配列である「ジョイント」と呼ばれるプロパティがあります。私はそれがまさに私が必要としているものだと思っていましたが、インスタンスのジョイントを反復して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 dynamic cast failed」というメッセージが表示されます。SKPhysicsBody の共同プロパティの操作方法について、ご意見をお寄せいただければ幸いです。より具体的には、配列内の項目を使用 (キャスト?) して、シーンの SKPhysicsWorld から項目を削除できるようにする方法です。