【问题标题】:Find what bodies are colliding in Box2D using C++使用 C++ 查找 Box2D 中碰撞的物体
【发布时间】:2011-02-07 21:40:04
【问题描述】:

我有一个用于检测碰撞的基本类,但我不知道如何查看哪些物体发生碰撞以触发适当的事件。假设我有一个乒乓球比赛,其中有一个 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);

看起来我可以得到指针中的实体,但我不知道如何将它们与其他实体进行比较。

【问题讨论】:

标签: c++ collision-detection box2d


【解决方案1】:

当您创建主体时,将 userdata 设置为有意义的值,但保持一致 :) 一个好的提示是其中始终具有相同种类和类型的数据、实体 ID 或引用给演员。

直接来自文档:

b2BodyDef bodyDef;

bodyDef.userData = &myActor;

因此,如果您走这条路,您将从b2Body 获取演员并将碰撞通知它,或者做其他事情。

同样来自docs

b2Fixture* fixtureA = myContact->GetFixtureA();

b2Body* bodyA = fixtureA->GetBody();

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

在上面的代码中,您将拥有参与者/实体,并且可以做任何您想做的事情...actorA.explode()

保持一致可能会让你免于精神错乱。如果将各种数据粘在其中,那么很难知道什么数据在什么主体中。另外,您无法真正以任何通用方式处理联系人。

【讨论】:

    【解决方案2】:

    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 方法,现在只是简单地返回 'Hear'。我将 body 的 userData 设置为整个 sprite 对象,因此我对对象本身的 body 具有灵活性。

    没有地板、墙壁和天花板的实际类引用,我只是将 userData 设置为“地板”等。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      相关资源
      最近更新 更多