1

私はBox2Dとcocos2dにかなり慣れていません。かなり簡単だと思っていたのですが、思ったより難しいことがわかり、どこにもうまく答えが見つかりません。

基本的には、b2bodyを動かして、アニメーションで特定の位置まで回転させたいと思います。

私はそれを正しい位置と回転に得ることができます:

targetBody->SetTransform(b2Vec2(10.0f,1.0f),10);

しかし、時間の経過とともにそこでアニメーション化する方法がわかりません。ボディに使用されているスプライトにcocos2dアニメーションを使用してみましたが、何も起こりません。何か案は?

4

2 に答える 2

0

一般に、Box2Dを使用して、オブジェクトの相互関係の物理的な動作をシミュレートします。Box2Dによって実装されるメカニズムのルールはCCSprite、対応するBox2dに従ってスプライトの平行移動と回転を継続的に更新する場合に、cocos2dがどのように動くかを指示しますb2Body。Box2dの世界を時間とともに繰り返し呼び出し、Box2dのシミュレーション結果に従ってスプライトの位置を更新する、ある種の繰り返し呼び出されるtick:メソッドがあります。step

このパターンはb2Body、タイプのsに対応しb2_dynamicBodyます。この場合、物理法則によって体の動きが決まり、スプライトはこれらのシミュレーション結果に従います。これが、スプライトの競合する位置の設定が、CCActionまたは直接でさえ、次のスプライトでほぼ瞬時に取り消される理由ですtick:

解決策1:キネマティックボディタイプ

ただし、には他のモードが存在します。b2Bodyこれらのモードの1つはb2_kinematicBody、平行移動がもはや世界によって支配されるのではなく、セッターを介して指示する速度または角速度によって支配されるモードです。したがって、次のように体型を操作することは1つの解決策になりますb2_kinematicBody

b2BodyDef bdef;
bdef.type = b2_kinematicBody;

これを使用すると、の速度と角速度をb2Body明示的に操作できます。この場合、Box2dは引き続きボディの移動を担当しますが、指定した速度に応じて、この特定のボディに適用される衝突や重力の力の影響はありません。また、この戦略では、あなたCCSpriteのはsに従いますb2Body。スプライトに競合する位置を直接設定するか、を適用して設定することCCActionは、上記と同じ理由で意味がありません。

解決策2:スプライトをBox2dから切り離します

スプライトをアニメーション化する別の方法は、それらのスプライトをBox2dから完全に切り離すことです。この場合、b2Bodyアニメートするスプライトの位置を決定するものはありません。さて、この場合、あなただけがあなたの位置と回転を指示します。つまり、そのプロパティCCSpriteを介して直接、またはを適用することによって。positionCCAction

于 2013-01-20T01:54:48.313 に答える
0

これを行うにはいくつかの方法があります。

タイムステップごとにSetTransformを使用して、時間の経過とともにボディの位置を徐々に更新し、実際にアニメーションを自分で実行することができます。この方法の欠点は、ボディが移動するのではなく新しい位置に「テレポート」するため、勢いがないことです。つまり、途中で何かにぶつかると、奇妙な結果が得られる可能性があります。それでも、何もヒットしないか、衝突に反応する必要がないことがわかっている場合は、これで問題ありません。

もう1つの方法は、SetLinearVelocityとSetAngularVelocityを使用して、体に適切な動きを与えることです。これにより、衝突の結果が現実的に保たれ、タイムステップごとに何も更新し続ける必要がなくなります。一方、体が目的の位置に到達したことを検出してから、速度をゼロに戻す必要があります。そうしないと、体は動き続けます。動的なボディの場合、ボディの重力スケールをゼロに設定するか、重力のバランスをとるために上向きの力を適用するか、移動中にボディタイプをキネマティックに変更することにより、何らかの方法で重力に対抗する必要があります。

于 2013-01-20T03:22:27.100 に答える