2

最近スプライト キットのリハーサルをしていて、非常に奇妙な問題に遭遇しました。親ノードをズーム(スケール変更)すると、SKPhysicsJointPin で結合されたボディが徐々に離れ、結合が壊れます。画像をお見せしましょう。

これは通常の状態です。 通常状態はこちら

ズームインしたときは次のとおりです。 ズームイン

そして、ズームアウトしたときは次のとおりです。 ズームアウト

体を結合する方法を尋ねると、茶色の棒を青いノードの中心にある青いノードに結合します。私の問題は何ですか?

編集:最近、接合体が動的でない場合、接合部が壊れず、すべてが期待どおりに機能することがわかりました。たとえば、[SKPhysicsBody bodyWithRectangleOfSize] の代わりに [SKPhysicsBody bodyWithEdgleLoopF​​romRect] を使用してスプライトの物理ボディを作成しても問題ありません。しかし、体が動的である必要があります。

物理をノードにアタッチするために使用するコードは次のとおりです。もちろん、すべて動的に行われます。簡潔にするためにハードコーディングしました。

 -(void)attachPhysics{
    //fixedComponentLeft & fixedComponentRight are two SKSprites
    fixedComponentLeft.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.frame.size.width];
    fixedComponentRight.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.size.width];
    beam1.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam1.size];
    joiningBody.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:joiningBody1.size.width];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentLeft.physicsBody bodyB:beam1.physicsBody anchor:fixedComponentLeft.position]];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin  jointWithBodyA:joiningBody.physicsBody bodyB:beam1.physicsBody anchor:beam1.endPoint]];
    beam2.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam2.size];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin  jointWithBodyA:joiningBody.physicsBody bodyB:beam2.physicsBody anchor:beam2.position]];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentRight.physicsBody bodyB:beam2.physicsBody anchor:beam2.endPoint]];
 }

上記のコードでは、beam1 と beam2 は SKSpriteNode のサブクラスのインスタンスです。デフォルトのアンカー ポイントは (0,0.5) で、スプライトの右端のポイントとして機能する endPoint というプロパティを追加しました。

4

3 に答える 3

1

あなたのコードがどのように見えるかはわかりませんが、同様の問題に遭遇しました.プラットフォーマーゲーム(スーパーマリオを考えてください)でタイルマップを使用し、レベルの最初にロープを追加するとすべて正常に機能し、ジョイント間の結合は保持されていましたが、そのロープをレベルの中央または最後に配置すると、ジョイントがより弾力的になり、ロープがバラバラになり、同時に物理世界が送信されました無限ループに陥り、すべてを粉砕して停止させます。

物理世界はシーンに属し、シーン自体のみに属し、実際に問題を引き起こしたノードの位置に基づいた位置にロープを追加していたため、修正は簡単であることが判明しました。

私が使用したとき

 CGPoint positionInScene = [self convertPoint:nodeB.position  fromNode:self.map];

次のコードは、ノードの位置をシーンの座標に変換し、後でその positionInScene 変数を使用して、ジョイントをアンカーとしてアタッチします。

[SKPhysicsJointFixed jointWithBodyA: nodeA.physicsBody
                              bodyB: nodeB.physicsBody
                             anchor: CGPointMake(positionInScene.x, positionInScene.y)];

すべてが正しく機能し始めました。

したがって、あなたの場合、使用したコードを示すことができれば、同様のことができるかもしれません。お役に立てれば。

于 2014-03-11T15:13:55.043 に答える