2016-01-27 18 views
11

フィジックスボディのSpriteKitシーンを作成しました。これはかなりうまくいっています。 Appleのベストプラクティスを「カメラノード」で使用して、シーンをスクロールしています。SpriteKit Physics移動するシーンのジョイントが壊れています

マイシーンノードツリーはそのようなものです:

Scene 
|- World 
    |- Camera node 
    |- Game nodes with physics bodys 

私の問題は、ゲーム中に私が動的に新しいジョイント(主に固定ジョイント)を使用して新しいノードを作成し、です。その時点で、ワールドノードは最初とは異なる位置にあります(例:スタート(0,0)、ゲーム中(1000,500)..) ここで、固定ジョイントのアンカーポイントは私が望むポジションは、シーンのどこかにあります。

私が想定し、シーンの座標系は、物理エンジンの座標系とは異なっています。

アンカーポイントのために、私は次の変換を使用します。

[world.scene convertPoint:node.position fromNode:node.parent]; 

私は「ノード」の位置にanchorpointを設定したいです。 ワールドノードを移動した後、アンカーポイントの計算がもう機能していません。

ありがとうございました!

Greetz - Nekro

更新:プレーヤー上でシーンを中央に

コード

- (void)centerOnNode:(SKNode*)node { 
    CGPoint cameraPositionInScene = [node.scene convertPoint:node.position fromNode:node.parent]; 
    node.parent.position = CGPointMake(node.parent.position.x - cameraPositionInScene.x, node.parent.position.y - cameraPositionInScene.y); 
} 
+0

ゲームノードをカメラノードの代わりにワールドに追加してみてください。私はテストアプリケーションを実装し、世界を移動した後にジョイントを追加する/カメラは期待どおりに動作しました。 – 0x141E

+0

@ 0x141E申し訳ありませんが、私はテキストを更新しました。ゲームノードは、カメラノードの子ノードではなく、カメラノードに並列に追加されます。奇妙なことは、私がSpriteKitシーンの物理を視覚化すると、散発的なジョイントが中央のプレイヤーノードに接続されているように見えることです。私はすでにジョイントを作成する唯一の関数にブレークポイントを設定しました。この "ゴーストジョイント"のために決して走りません... – Nuker

+0

あなたの物理機関はシーン座標を使用して接続されていますか?ノードではないのですか? – ColdSteel

答えて

0

SpriteKitベースの物理学とのジョイントを使用する2つの要件があります

  1. は、世界(場面)空間における関節を定義する。
  2. 世界を動かさないでください。

あなたの質問とコメントから、#1の権利があるように聞こえます。ジョイントがシーンの直接の子ではないノード間にある場合は、それらを使用する前にシーン空間に座標を変換する必要がありますジョイントを定義します。

しかし、SpriteKitの物理は、ルート座標系を移動しようとするとうまく処理できません。したがって、世界を動かすことによって「カメラ」を実装すると、関節のトラブルが発生します。代わりに:あなたがターゲットに余裕があれば

  • は唯一のiOS 9.0/OS X 10.11/tvOS 9.0とアップ、世界を動かすのではなく、SKCameraNodeを使用しています。それも簡単です!

    (iOS 9のみをサポートできるかどうか不思議であれば、adoption rate statisticsを確認し、開発スケジュールと比較してください... iOS 9はしばらく出荷されない場合、「 - あなたがiOS 8/OS X 10.10をサポートしている場合は、余分なレイヤーを追加してみてください。あなたのシーンに:あなたのシーンの子供であるノードとあなたのゲームコンテンツのすべての親を動かすことによってカメラを偽造します。

関連する問題