在 box2d 中实现 "begin contact"

Implementing "begin contact" in box2d

我正在用 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();
}

所有这些都在我的主 class 的更新函数中调用(其中还包含大部分游戏变量)。问题是我希望代码仅在两个对象 first 发生碰撞时被调用,否则像 score++ 这样的东西最终会随着它的更新而价值暴涨碰撞持续时间。我知道 box2d 中有一个 "contact listener" class 函数 "begin contact",但是没有好的文档可以帮助初学者学习如何实现它。例如,如果我向我的 main class 添加一个联系人侦听器,我如何让它处理我的分数,例如,如果联系人侦听器无权访问这些变量?或者我首先在哪里调用 "begin contact" ?对不起,如果这些是显而易见的问题,但我希望有人能澄清这些问题。提前谢谢你。

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

  1. 看看Box2D C++ tutorials - Collision callbacks。就个人而言,我认为这是使用 b2ContactListener class.
  2. 的很好的教程
  3. 只需让包含分数信息的class继承自b2ContactListener。这样,您的 BeginContact 方法将可以直接访问 score 数据。大概那将是你的 "main" class。一定要通知你的 b2World 实例使用它,方法是调用你的世界实例的 SetContactListener 方法,并带有指向包含实例的分数的指针(你从 [=10 子class编辑=]).

如果您在这方面仍需要更多帮助,请为此添加评论或更新您的问题以反映尚不清楚的地方。