0

cocos2d-box2d で何を打ってもスピードを落とさず、画面上を跳ね回るボディ [A ball Body] を作成するにはどうすればよいですか?

4

2 に答える 2

1

固定具の反発を 1 に、摩擦を 0 に設定します。

Box2D のマニュアルには次のように書かれています。

反発は、オブジェクトをバウンドさせるために使用されます。通常、反発値は 0 から 1 の間に設定されます。ボールをテーブルに落とすことを考えてみましょう。<...> 値 1 は、ボールの速度が正確に反映されることを意味します。これを完全弾性衝突と呼びます。

摩擦値 0 は摩擦をオフにします

摩擦がなく、完全に弾力性のある衝突により、ボールは画面上で跳ね返り、静的な環境で速度を失ったり上げたりすることはありません。環境が静的でない場合、移動するオブジェクトと衝突するとボールの速度が変化します。

この問題を解決するには、次のトリックを提案します。接触リスナーを設定し、PostSolve メソッドでボールの正しい速度を次のように設定します。

void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse)
{  
   if(contact->GetFixtureA()->GetBody() == YOUR_BALL_BODY ||
      contact->GetFixtureB()->GetBody() == YOUR_BALL_BODY)
   {
       float speed = YOUR_BALL_BODY->GetLinearVelocity().Length();
       float koef = YOUR_NEEDED_SPEED / speed;
       YOUR_BALL_BODY->SetLinearVelocity(koef * YOUR_BALL_BODY->GetLinearVelocity());
   }
}

コンタクトリスナーの設定方法はこちらをご覧ください

于 2013-01-26T19:09:07.940 に答える
0

ボディの速度にスカラー量を定期的に掛けt/v.lengthます。ここで、t は目標速度です。

他の答えは、おそらく必要なものよりも少し複雑です。

于 2013-01-27T17:52:32.833 に答える