2011-02-07 7 views
3

私は衝突を検出するための基本クラスを持っていますが、どのボディが衝突して適切なイベントをトリガするかを理解できません。私はポンのゲームがあり、ボールボディーとトップウォールボディーを持っていると言います。これらが衝突しているかどうか、どうすればわかるでしょうか?ここに私があなたにアイデアを与えるために使っているクラスがあります。C++を使ってBox2Dでどのボディが衝突しているのかを確認

class MyListener : public b2ContactListener 
{ 
    void BeginContact(b2Contact* contact) 
    { 
     b2Fixture* fixtureA = contact->GetFixtureA(); 
     b2Fixture* fixtureB = contact->GetFixtureB(); 
     b2Body* body1 = fixtureA->GetBody(); 
     b2Body* body2 = fixtureB->GetBody(); 
     cout << "started"; 
    } 
    void EndContact(b2Contact* contact) 
    { 
     cout << "ended\n"; 
    } 
}; 
MyListener listener; 
world.SetContactListener(&listener); 

私はポインタでボディを取得できるように見えますが、他のボディと比較する方法はわかりません。

+2

この質問は、http://gamedev.stackexchange.comの良い候補のようです – James

答えて

4

あなたが体を作成すると、意味のあるものにユーザデータを設定しますが、一貫して:)良いヒントは、常にそこに同じ種類のデータおよびタイプ、俳優へのエンティティIDまたは参照を持つことです。

ストレートドキュメントから:あなたはこの道を行けば

b2BodyDef bodyDef; 

bodyDef.userData = &myActor; 

だから、b2Bodyから俳優を取得し、衝突のそれを知らせる、または他の何かをするだろう。 docsからも

:あなたが俳優/エンティティを持っているでしょうし、... actorA.explode()をご希望何でも行うことができます上記のコードでは

b2Fixture* fixtureA = myContact->GetFixtureA(); 

b2Body* bodyA = fixtureA->GetBody(); 

MyActor* actorA = (MyActor*)bodyA->GetUserData(); 

矛盾がなければ、狂気からあなたを救う可能性があります。すべての種類のデータをそこに格納すると、どのデータがどのような本体に入っているのかが分かりにくくなります。また、あなたは本当にどのような一般的な方法で連絡先を処理することはできません。

0

Skurmedelの答えは私に非常に助けてくれました。私はこれを解決するために何をしていたのか少しの情報を追加すると思った。

私は、OPのように、何が何を打っていたのかチェックしたいと思っていました。私は心がゲーム画面の壁の周りにバウンドし、彼らが他の心や壁に当たっているかどうかを知りたがっていました。

私は接触

 world.setContactListener(new ContactListener() { 
     @Override 
     public void beginContact(Contact contact) { 

      Gdx.app.log("GameScreen", "Contact Made! Fixture A: " + contact.getFixtureA().getBody().getUserData().toString()); 
      Gdx.app.log("GameScreen", "Contact Made! Fixture B: " + contact.getFixtureB().getBody().getUserData().toString()); 
     } 

を表示するには、このコードを使用し、私の心のオブジェクト内に、私は単に今は「聞く」を返しするtoStringメソッドをオーバーライド。私は体全体のスプライトオブジェクトとしてbodyのuserDataを設定していますので、オブジェクト自体のボディに柔軟性があります。

床、壁のための私の実際のクラスの参照を持つ、そして天井は、私は単純にこの方法を使用するなど

GameScreen: Contact Made! Fixture A: Ground 
GameScreen: Contact Made! Fixture B: Heart 

「フロア」としてのuserDataを設定し、後でそれをbeefingない、私はことができるようになります接触している相手に基づいてオブジェクトがどのように反応するかを変更します。

関連する問題