7

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 から項目を削除できるようにする方法です。

4

1 に答える 1

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)
    }
}

同じことを約束するフレームワーク管理配列が既に存在するため、これは仕事をするための最もエレガントな方法ではないようです。しかし、私はそれを利用することができず、これは今のところうまくいきます。

于 2014-12-26T00:47:18.360 に答える