3

ズームインおよびズームアウトできる物理体のレベルを含む SpriteKit ゲームを構築しようとしています。ズーム レベルを変更すると、物理の世界が期待どおりに動作せず、奇妙なことが起こります。

物理ボディを持つノードがアニメーション化し、期待どおりに動作します。レベルのズームは、すべてのゲーム要素を含む単一の「ワールド ノード」のスケールを調整するピンチ ジェスチャで処理されます。これは、シーンのスケーリングが恐ろしいことを行うように見えるため、これを処理する便利な方法であり、ワールド ノードの上に任意のゲーム インターフェイス要素用の個別のスケーリングされていないノードを簡単に追加できます。

ズームは次のように機能します。

- (void) handlePinchGesture:(UIPinchGestureRecognizer *) gesture {
    if (gesture.state == UIGestureRecognizerStateChanged) {
        [self.worldNode runAction:[SKAction scaleBy:gesture.scale duration:0.0]];
        gesture.scale = 1;
    }
}

通常のズーム レベルでは、すべてがうまく機能し、視覚的には、さまざまなズーム レベルでもすべてがうまく見えます。問題は、ズームが変更されると、物理体が他のオブジェクトに対して同じ速度ではなく、同じ速度で移動し続けることです。その結果、シーンをより多く表示するためにズームアウトすると、すべてがはるかに速く移動します。

これは、物理ワールドがシーンにのみ接続されており、「ワールド ノード」の調整されたスケールを認識していないという事実の副作用のようです。ただし、物理体は相対空間内でノードを同じ速度で移動し続ける必要がありますか?

SpriteKit がそのように動作する理由、またはこれを回避する方法について、誰かが洞察を提供できますか?

4

2 に答える 2

1

この回答は、回答のコメントで @TheisEgeberg が提案したアプローチに基づいています。コメントではなく回答である必要があると思うので、この回答を作成しました。彼がこのアプローチで回答を更新した場合、私はこの回答を削除します。質問に対する答えとしてこのアプローチを採用することで、人々は多くの頭痛の種を取り除くことができます。

1.物理ノードを含む SKScene を作成します。

2. SKScene の模倣として機能する SKNode を作成します。

3. 作成して SKScene に追加するノードごとに、別の模倣ノードを作成しますが、physicsBody は作成せず、それを模倣 SKNode に追加します。

4. SKScene で updateMimicNodes というメソッドを作成します。このメソッドは、すべてのノードを反復処理し、対応するノードの位置を更新します。これは、模倣ノードの zRotation です。update メソッドからそのメソッドを呼び出して、フレームごとに更新されるようにします。

5. Mimic ノードを好きなようにスケーリングします。

6.hidden プロパティを使用して、物理ボディを持つ SKScene ノードを非表示にします。SKScene に追加する SKNode レイヤーにすべてのノードを配置する場合、その SKNode の隠しプロパティを YES に設定するだけです。

管理を容易にするために、すべてのノードに「mimic」プロパティを作成し、そのプロパティを mimic ノードの対応するノードに設定しました。その後、次のように更新で各ノードを更新できます。

node.mimic.position = node.position
node.mimic.zRotation = node.zRotation

後でこのアプローチのサンプル コードを投稿するかもしれませんが、これらの手順に従えば、約束の地にたどり着くはずです。

また、すべてのタッチでは、物理体を使用して SKScene の座標系に位置を変換する必要があることに注意してください。

于 2015-01-12T00:10:09.757 に答える