2011-02-07 58 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 

使用这种方法,后来催谷它,我就可以根据他们与谁联系来改变对象的反应方式。