2011-02-07 88 views
3

我有一個用於檢測碰撞的基本類,但我無法弄清楚如何查看碰撞什麼物體來觸發適當的事件。讓我們說我有一場乒乓球比賽,並在其中一個球體和topwallBody。如何判斷這些是否碰撞。這裏是我用來給你一個想法的課程。使用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 2011-02-07 22:03:43

回答

4

創建主體時,請將userdata設置爲有意義的內容,但必須一致 :)一個好的提示是始終具有相同類型的數據,實體ID或對主角的引用。

直接從文檔:

b2BodyDef bodyDef; 

bodyDef.userData = &myActor; 

所以,如果你去這條路,你會從b2Body獲得演員,並通知它的碰撞,或做其他事。

docs

另外:

b2Fixture* fixtureA = myContact->GetFixtureA(); 

b2Body* bodyA = fixtureA->GetBody(); 

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

在上面的代碼中,你將有演員/實體,並可以做任何你想... actorA.explode()

保持一致可能會讓你免於精神病。如果有人在那裏粘貼各種數據,就很難知道什麼是數據。另外,你不能以任何通用的方式處理聯繫人。

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設置爲整個sprite對象,所以我對對象本身具有靈活性。由於沒有

的地板,牆壁我的實際類引用和天花板我簡單地將用戶數據爲「樓」等

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

使用這種方法,後來催谷它,我就可以根據他們與誰聯繫來改變對象的反應方式。