libgdx-box2D-contactlistener
我正在使用contactListener测试box2D中两个实体之间的碰撞 这是我使用world.setContactListenernew-Box2DWorldthis添加的整个contactListener类libgdx-box2D-contactlistener,libgdx,box2d,Libgdx,Box2d,我正在使用contactListener测试box2D中两个实体之间的碰撞 这是我使用world.setContactListenernew-Box2DWorldthis添加的整个contactListener类 public class Box2DWorld implements ContactListener{ World world; GameScreen gameScreen; Car car; public enum BodyName{ frontWheel,rearWh
public class Box2DWorld implements ContactListener{
World world;
GameScreen gameScreen;
Car car;
public enum BodyName{
frontWheel,rearWheel,carShell,ground,finishSensor
}
/**
* this class handles collisions and body userdata
* @param gameScreen
*/
public Box2DWorld(GameScreen gameScreen) {
this.gameScreen = gameScreen;
world = gameScreen.world;
this.car = gameScreen.car;
}
/*
* the debug should be like
*
* BEGONCONTACT,preSolve,postSolve,......postsolve,ENDCONTACT,BEGINCONTACT,preSolve,postSolve
*
* but i am getting debug like
*
* BEGINCONTACT,preSolve,postSolve,......postsolve,BEGINCONTACT,presolve,ENDCONTACT,preSolve,postSolve...
*
* i can't understand why begincontact appears twice without endcontact in between and also bodies are in contact
* even after endcontact
*
*/
@Override
public void beginContact(Contact contact) {
BodyName bodyA = (BodyName) contact.getFixtureA().getBody().getUserData();
BodyName bodyB = (BodyName) contact.getFixtureB().getBody().getUserData();
if((bodyA == BodyName.frontWheel && bodyB == BodyName.ground )||(bodyA == BodyName.ground && bodyB == BodyName.frontWheel)){
car.frontWheel.onGround = true;
System.out.println("begin contact");
}
}
@Override
public void endContact(Contact contact) {
BodyName bodyA = (BodyName) contact.getFixtureA().getBody().getUserData();
BodyName bodyB = (BodyName) contact.getFixtureB().getBody().getUserData();
if((bodyA == BodyName.frontWheel && bodyB == BodyName.ground )||(bodyA == BodyName.ground && bodyB == BodyName.frontWheel)){
car.frontWheel.onGround = false;
System.out.println("contact end");
}
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
BodyName bodyA = (BodyName) contact.getFixtureA().getBody().getUserData();
BodyName bodyB = (BodyName) contact.getFixtureB().getBody().getUserData();
if((bodyA == BodyName.frontWheel && bodyB == BodyName.ground )||(bodyA == BodyName.ground && bodyB == BodyName.frontWheel)){
System.out.println("PreSolve");
}
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
BodyName bodyA = (BodyName) contact.getFixtureA().getBody().getUserData();
BodyName bodyB = (BodyName) contact.getFixtureB().getBody().getUserData();
if((bodyA == BodyName.frontWheel && bodyB == BodyName.ground )||(bodyA == BodyName.ground && bodyB == BodyName.frontWheel)){
System.out.println("postSolve");
}
}
我的任务是这样的
开始接触
预溶
后解
.
.
.
.
.
.
预溶
后解
开始接触
预溶
末端接触
后解
预溶
.
.
.
我不明白为什么begincontact出现在endcontact之前
地面车身和前轮车身各只有一个固定装置
我一个星期都搞不懂,请帮我记住,接触是在两个固定装置之间,而不是两个身体之间 我猜你的场地是由很多固定装置组成的,它们都在同一个场地上,对吗?当轮子在夹具上滚动时,它一次可以接触多个夹具,因此可以按顺序获得BeginTexture1、BeginTexture2和endfixture1。这很正常。我想如果你打印出每个接触事件中涉及的地面装置,你就会明白我的意思
如果您想知道车轮何时接触地面,则需要跟踪当前接触的固定装置总数。可以通过在获得“开始”事件时递增计数器,在获得“结束”事件时递减计数器来实现。然后,你可以随时检查柜台,如果它是超过零,车轮接触地面。< / P>你没有检查的情况下,BOYDA==Y和BODYB= =席西AM检查,我只是没有;don’不要在这里加上它,那么你就加上它吧,这样人们就不会浪费他们和你的时间,为你已经做过的事情提供建议。我想这里一定还有你没有添加的东西,因为如果一对尸体在最终接触发生之前发生了两次初始接触事件,那将是Box2D中的一个巨大错误。我真的很抱歉我没有添加,我没有提问的经验,请原谅我。我非常喜欢你的博客,你给了我很大的帮助,也帮了我很多忙people@iforce2d我现在编辑了我的问题,我不知道是否应该添加更多。如果我缺少任何东西,请告诉我。我将其更改为单个夹具,但问题仍然存在,具体取决于它的形状类型,实际导出的夹具可能不相同。例如,Box2D最多只能使用8个顶点的凸多边形,因此,当您导出一个大型多边形或一个具有凹面部分的多边形时,RUBE将创建Box2D可以使用的单个多边形。正如我提到的,你所看到的并不是真正的问题,而是预期的行为。你有没有试着打印出每个接触事件都是由哪些装置引起的?哇,很好,修复了它,就像你说的,这些开始接触来自不同的装置。不知道box2D只能有8个顶点。感谢您的帮助: