4

そこで、基本的にピン ジョイントを使用して結合された四角形である SKSpriteNodes のリングを作成しました。このリングを SKShapeNode サークル内で中断したいと思います。SKPhysicsJointLimit を使用して、各ノードを SKShapeNode に接続しました。

これはすべて正常に機能し、maxLength を主観的に決定する「正しい」数値に設定すると、探している効果が得られます。

簡単にアクセスできるように、すべてのリミット ジョイントを配列内に格納し、physicsWorld に追加しました。

コードを正しくするのに少し手間がかかりましたが、これらはすべて正しく期待どおりに機能します。これらはうるさいです!

ここで、私が本当にやりたいことは、maxLength を大きな数値に設定し、時間の経過とともにその数値を徐々に減らして、リングが「ゆるくぶら下がっている」から「引っ張られた」状態になるようにすることです。

私はさまざまなアプローチを試みましたが、どれもうまくいかないようです。まず、私は試しました:

SKAction *tighten = [SKAction customActionWithDuration:1 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
    CGFloat t = elapsedTime/duration;
    CGFloat p = t*t;
    CGFloat newLimit = fromLimit*(1-p) + toLimit*p;
    for (int i = 0; i < _connectors.count; i++){
        [[_connectors objectAtIndex:i] setMaxLength:newLimit];
    }
}];

[_ring runAction:tighten];

しかし、これはまったく何もしませんでした。

私は、physicsWorld にジョイントを追加した後、ジョイントのプロパティを変更できないように見えることに最終的に気付きました。そこで、シーンの update メソッドで次のようなことを試しました。

        [scene.physicsWorld removeJoint:[_connectors objectAtIndex:i]];
        [[_connectors objectAtIndex:i] setMaxLength:newLimit];
        [scene.physicsWorld addJoint:[_connectors objectAtIndex:i]];

しかし、これもうまくいきませんでした。エラーが発生しました:

'Cant add joint <PKPhysicsJointRope: 0x114e84350>, already exists in a world'

明らかに削除したのに。だから、ここからどこへ行けばいいのかわからない。ジョイントに関するドキュメントとインターネット上の既存の資料は非常に薄いです。次に試みるのは、すべてのジョイントを削除して追加することだと思いますが、それは非常に面倒です。

どんな考えでも本当に役に立ちます!

4

1 に答える 1

1

OPが指摘したように、変更を適用する前に物理世界からジョイントを削除する必要があるようです。以下は私のために働いた。

for joint in joints
{
    physicsWorld.removeJoint(joint)
    joint.maxLength = yourNewValue
    physicsWorld.addJoint(joint)
}
于 2016-05-04T07:34:47.600 に答える