一般に、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
を介して直接、またはを適用することによって。position
CCAction