2010-11-24 5 views
1

私はバレーボールの試合をして、box2dに基づいてあらゆる行動をシミュレートしようとしています。私がしたいことは、プレーヤーがボールを打ったときとボールが壁に当たったときに違うボールを返すことです。ですから、最初の場合ボールは速く飛ぶべきであり、2番目の場合はゆっくり飛ぶべきです。box2D flash:選択的リザーブ

しかし、私はプレーヤーと壁オブジェクトのための払い戻しを別の方法で設定しようとすると、プレーヤー自体が壁から跳ね上がっていることに気が付いています...選択的なやり方でそれを行う方法はありますか?例えば。打撃のフロアは、プレーヤーにバウンスを起こすべきではありません....しかし、プレーヤーがボールを打つならば、それは多く飛び跳ねるはずです。

答えて

2

残念ながら、あなたが正しいです、Box2Dはこの設定を持っていません。

代わりにできることは、プレーヤーとボールの両方に一致する連絡先リスナーイベントを待ち受けることです。それが起こると、ボールに非常に大きな力が加わります。私は私の頭の上にこれをオフに入力された

編集

は、私はそれが正確に右だか分かりません。

public class MyContactListener extends b2ContactListener { 
    override public function Add(point:b2ContactPoint):void { 
     var ball:b2Body = ... 
     var player:b2Body = ... // fill these 
     var force:b2Vec2; 

     if(point.shape1.GetBody() == ball && point.shape2.GetBody() == player) { 
      force = point.normal.Copy(); 
      force.Multiply(SOMETHING); 
      ball.ApplyForce(force); 
     } else if(point.shape1.GetBody() == player && point.shape2.GetBody() == ball) { 
      force = point.normal.Copy(); 
      force.Multiply(-SOMETHING); 
      ball.ApplyForce(force); 
     } 
    } 
} 

ここでは何が起こっているのですか?

このクラスのインスタンスを作成し、おそらくworld.SetContactListener(new MyContactListener)などの世界に登録する必要があります。

Add()メソッドは、2つのボディが接触したときに起動します。適用される力は接触法線の方向にあります(これはあなたを身体から他の身体に移動させます)。

コンタクトリスナーシステムが設定されているため、ボールまたはプレーヤーのいずれかがb2ContactPoint構造体のbody#1になる可能性があるため、その可能性をコードする必要があります。法線の方向は、どちらがボディ#1(したがってマイナス記号)であるかに依存する。私は実際にどの方向に進むかを覚えていないので、力を逆にする必要があるかもしれません(他のブランチにマイナス記号を入れてください)。

それ以外は合理的に明らかです。 Box2Dはここでよく知られているようには見えないので、Box2Dフォーラム(http://www.box2d.org/forum/

+0

の例でコードラインが本当に役に立ちます:) –

+0

@Oleg、それは役に立ちますか? –

+0

ありがとう! –