使用C ++查找在Box2D中碰撞的物体

时间:2011-02-07 21:40:04

标签: c++ collision-detection box2d

我有一个用于检测碰撞的基本类,但我无法弄清楚如何查看碰撞的物体以触发相应的事件。让我们说我有一个乒乓球比赛,其中有一个ballBody和topwallBody。我怎么知道这些是否发生碰撞。这是我用来给你一个想法的课程。

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 个答案:

答案 0 :(得分: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()

保持一致可能会让你免于精神错乱。如果在那里粘贴各种数据,那么知道什么数据在哪个体内就变得非常困难。此外,您无法以任何通用方式处理联系人。

答案 1 :(得分: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方法,只需返回&#39;听到&#39;目前。我将body的userData设置为整个sprite对象,因此我可以灵活地在对象本身中使用body。

没有我对楼层,墙壁和天花板的实际类引用我只是将userData设置为&#39; Floor&#39;等

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

使用这种方法,并在以后加强,我将能够根据他们联系的人改变对象的反应。