【问题标题】: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
使用这种方法,并在以后加强它,我将能够根据对象的联系方式来改变对象的反应方式。