3

iOS用のCocos2d + Box2dで書かれたドラッグアンドドロップ機能の実装が機能しています。Sprite Kit に移植する必要があります。ロジックは非常に基本的です。

  • ユーザーが画面に触れると、指の下にあるスプライトを見つけます
  • 見つかったスプライトとシーンの物理体の間にマウス ジョイントを作成し、ジョイントのターゲットをタッチの位置に設定します
  • タッチが移動したときに、ジョイントのターゲットを新しい位置に更新します
  • タッチが終わったらジョイントを外す

すべてがうまくいっています。タッチが終了したときに物理がシミュレートされる方法が気に入っています。ドラッグされた形状は、ドラッグの速度と方向に依存する速度を持っているため、スプライトを動かしているときに画面から指を離すと、同じ方向に動き続けますが、影響を受けます重力と減衰。

残念ながら、スプライト キットを使用して同じ効果を再現することはできません。マウス関節のような関節はありませんが、他の関節タイプを使ってみました。私はSKPhysicsJointFixedでほとんど成功しました - 私は新しいスプライトとそれとドラッグされたスプライトの間にジョイントを作成しています。残念ながら、Cocos2d + Box2d のマウス ジョイントのようには機能しません。スプライトをドラッグしている間、その速度は常にゼロになります。そのため、画面から指を離すたびに、ドラッグされたスプライトはすぐに停止し、重力の影響を受けて落下し始めます。ドラッグ中に指をどれだけ速く動かしても、ドラッグした形状を離した後は、まったく同じように動作します。

私の質問は、スプライト キットでマウス ジョイントを実装する方法、または上記のように動作するドラッグ アンド ドロップ機能を実装する方法です。

更新: これは、Sprite Kit を使用して実装しようとしているものをより明確に表示できる box2d マウス ジョイントの例です: http://blog.allanbishop.com/wp-content/uploads/2010/09/Box2DJointTutorial1.swf

4

2 に答える 2

1

唯一の問題が速度である場合、それは簡単に修正できます。

前のタッチ位置から現在のタッチ位置を引いて、最後のタッチと現在のタッチの間の速度を取得します。applyForce:このベロシティをボディに適用するために使用します。

ドラッグ中にボディが勝手に動くのを防ぐために、呼び出し後にボディから新しい速度を読み取りapplyForce:、ivar に保持し、ボディの速度をゼロに設定します。

タッチが終わったら、ボディの速度を ivar として保持している速度に設定します。

これが機能しない場合は、applyImpulse: を使用してみてください: および/または 2 つのメソッドのいずれかを呼び出す前に速度を設定します。

sprite.physicsBody.velocity = bodyVelocity;
[sprite.physicsBody applyForce:touchVelocity];
bodyVelocity = sprite.physicsBody.velocity;
sprite.physicsBody.velocity = CGVectorMake(0, 0);

こうすることで、ドラッグ中にボディのコントロールを失うことなく、ボディの速度を維持できます。

于 2013-10-13T19:19:33.547 に答える