我有一个用于检测碰撞的基本类,但我无法弄清楚如何查看碰撞的物体以触发相应的事件。让我们说我有一个乒乓球比赛,其中有一个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);
看起来我可以在指针中找到尸体,但我不知道如何将它们与其他物体进行比较。
答案 0 :(得分:4)
创建实体时,将userdata设置为有意义的内容,但保持一致 :)一个好的提示是始终在那里拥有相同种类和类型的数据,实体ID或引用演员。
直接来自文档:
b2BodyDef bodyDef;
bodyDef.userData = &myActor;
所以,如果你走这条路,你会从b2Body
得到演员并告知碰撞,或做其他事情。
同样来自docs:
b2Fixture* fixtureA = myContact->GetFixtureA();
b2Body* bodyA = fixtureA->GetBody();
MyActor* actorA = (MyActor*)bodyA->GetUserData();
在上面的代码中,您将拥有演员/实体并可以做任何您想做的事情...... actorA.explode()
。
保持一致可能会让你免于精神错乱。如果在那里粘贴各种数据,那么知道什么数据在哪个体内就变得非常困难。此外,您无法以任何通用方式处理联系人。
答案 1 :(得分:0)
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方法,只需返回&#39;听到&#39;目前。我将body的userData设置为整个sprite对象,因此我可以灵活地在对象本身中使用body。
没有我对楼层,墙壁和天花板的实际类引用我只是将userData设置为&#39; Floor&#39;等
GameScreen: Contact Made! Fixture A: Ground
GameScreen: Contact Made! Fixture B: Heart
使用这种方法,并在以后加强,我将能够根据他们联系的人改变对象的反应。