在LibGDX中,ContactListener的EndContact并不总是被每次调用。这与Box2d有关,涉及到联系人的生命周期。

8
我刚开始接触box2d并试图在LibGDX游戏中实现它。我想要做的是检测各个物体之间的碰撞。因此,我创建了一个collisionDetection类,并在其中实现了ContactListener,这为我提供了4个重写方法,即beginContact()和endContact(),我必须处理它们。同时,我将collisionDetection类的对象传递给world.setcontactListner(collisionDet),当世界类中的物体相互碰撞时,collisionDetection类的重写方法将被调用。但问题在于,当物体碰撞时,beginContact()方法每次都会被调用,但是当物体失去接触时,endContact()方法并不总是被调用。那么,我们有哪些可能的方法可以每次检测到endContact()呢?
collisionDetection类的代码如下:
public class CollisionDetection implements ContactListener {
static Fixture fixtureA;
static Fixture fixtureB;
public static boolean Colliding=false;
World world;


protected CollisionDetection(World world, long addr) {
    this.world = world;
    // TODO Auto-generated constructor stub
}

@Override
public void beginContact(Contact contact) {
    // TODO Auto-generated method stub
    fixtureA = contact.getFixtureA();
    fixtureB = contact.getFixtureB();

    Colliding=true;

}

@Override
public void endContact(Contact contact) {
    // TODO Auto-generated method stub      
    Colliding=false;

}

@Override
public void preSolve(Contact contact, Manifold oldManifold) {
    // TODO Auto-generated method stub

}

@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
    // TODO Auto-generated method stub


}

并且是世界级的

collisionDet = new CollisionDetection(worldbox, 0);
worldbox.setContactListener(collisionDet);

谢谢


你确定物体失去了接触吗?使用Box2dDebugRenderer进行检查。 - R Hyde
是的,它们失去了联系,因为我正在使用TouchPad坐标移动一个物体(动态),当该物体穿过另一个物体(静态)时,并不总是调用endContact() - Jagdeep Singh
好的。我建议使用调试渲染器的原因是它绘制的是物体本身,而不是你可能绘制的任何与物体匹配与否的东西。另外,你在回调函数中调用setEnabled(true)有什么特殊原因吗? - R Hyde
那只是为了测试而已。我已经更新了它。 - Jagdeep Singh
2
你是否有一个最小的示例代码可以演示问题,因为你这里展示的看起来相当合理。但是你没有向我们展示可能同样相关的事情,例如,你多久调用一次world.step()以及传递了哪些参数等。 - R Hyde
我有同样的问题。 - Oliver Dixon
1个回答

0

你可能正在使用 setTranform() 移动对象... 当我们使用 set transform 时,Box2d 不会提供回调


不,我是用 body.setLinearVelocity() 来移动它们。 - Jagdeep Singh
1
你是否使用System.out.println("endcontact");在endContact中调试过你的代码?我看到你把布尔变量Colliding设为了静态的,这可能会同时在Box2d的相同步骤周期内给出begin contact和end contact的回调,因此你无法检测到它。尝试使用system.out.println进行调试。 - Vikalp Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接