我正在用 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();
}
所有这些都在我的主类(也包含大部分游戏变量)的更新函数中被调用。问题是我希望仅在两个对象 first 发生碰撞时调用代码,否则像 score++
这样的东西会随着它的更新而最终值(value)暴涨碰撞持续时间。我知道 box2d 中有一个具有“开始接触”功能的“接触监听器”类,但是没有好的文档可以帮助初学者学习如何实现它。例如,如果我向我的主类添加一个联系人监听器,我如何让它处理我的分数,例如,如果联系人监听器无权访问这些变量?或者我首先在哪里称呼“开始联系”?对不起,如果这些是显而易见的问题,但我希望有人能澄清这些问题。提前谢谢你。
最佳答案
这里有一些建议,希望能回答您的问题:
- 看看Box2D C++ tutorials - Collision callbacks .就我个人而言,我认为这是一个关于使用
b2ContactListener
类的很棒的教程。 - 只需让包含分数信息的类继承自
b2ContactListener
。这样您的BeginContact
方法将可以直接访问score
数据。大概那将是你的“主要”类(class)。一定要通知你的b2World
实例通过调用你的世界实例的SetContactListener
方法使用这个指针指向包含实例的分数(你从b2ContactListener
).
如果您在这方面仍需要更多帮助,请为此添加评论或更新您的问题以反射(reflect)尚不清楚的地方。
关于c++ - 在 box2d 中实现 "begin contact",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43129290/