cocos2d-box2d で何を打ってもスピードを落とさず、画面上を跳ね回るボディ [A ball Body] を作成するにはどうすればよいですか?
質問する
136 次
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 に答える