在box2d中实现“开始联系”

时间:2017-03-30 22:14:43

标签: c++ box2d game-engine collision subclassing

我正在使用box2d进行游戏。我有以下代码:

    for (int contact_num = 0; contact_num<contact_count; ++contact_num)
{
    if (contact->IsTouching())
    {
        // get the colliding bodies
        b2Body* bodyA = contact->GetFixtureA()->GetBody();
        b2Body* bodyB = contact->GetFixtureB()->GetBody();

        // check if one of the colliding objects is a censor
        bool sensorA = contact->GetFixtureA()->IsSensor();
        bool sensorB = contact->GetFixtureB()->IsSensor();

        // do stuff, mainly handling variables

        }
    }
    // Get next contact point
    contact = contact->GetNext();
}

所有这些都是在我的主类的更新功能中调用的(它还包含大多数游戏变量)。问题是我希望仅在两个对象第一次发生碰撞时才调用代码,因为否则score++之类的东西会在碰撞持续时间更新时最终飙升。我知道box2d中的“联系人监听器”类具有“开始联系”功能,但是没有好的文档可以帮助初学者学习如何实现它。例如,如果我将一个联系人监听器添加到我的主类,如何让它来处理我的分数,例如,如果联系人监听器无法访问这些变量?或者我在哪里首先称之为“开始接触”?对不起,如果这些是明显的问题,但我希望有人可以澄清这些。提前谢谢。

1 个答案:

答案 0 :(得分:2)

这里有一些建议,希望能回答你的问题:

  1. 看看Box2D C++ tutorials - Collision callbacks。就个人而言,我认为这是一个使用b2ContactListener课程的好教程。
  2. 只需让包含得分信息的班级继承自b2ContactListener。这样,您的BeginContact方法就可以直接访问score数据。据推测,这将是你的主要&#34;类。请务必通过调用您的世界实例的b2World方法并通过指向包含实例的分数的指针(SetContactListener实例来通知您的b2ContactListener实例。{{1} }})。
  3. 如果您仍需要更多帮助,请为此添加评论或更新您的问题以反映尚不清楚的内容。