当前位置: 首页 > 知识库问答 >
问题:

libgdx-box2D-contactlistener

平山
2023-03-14

我正在使用ContactListener测试box 2D中两个物体之间的碰撞

这是我在世界上使用的所有contactListener类。设置ContactListener(new Box2DWorld(this))以添加它

 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");    
    }

}

我的dedub是这样的

beginContact preSolve postSolve。preSolve postSolve beginContact preSolve END CONTACT postSolve preSolve。

我不明白为什么begincontact出现在endcontact之前

地面和前轮车身各只有1个夹具

我一周都搞不懂,请帮帮我

共有1个答案

郦翰学
2023-03-14

请记住,接触是在两个固定装置之间,而不是两个实体之间。

我猜你的地面是由许多固定装置组成的,它们都在同一个地面上,对吗?当车轮在固定装置上滚动时,它一次可以接触到多个固定装置,所以你可以按这个顺序开始(固定装置1)、开始(固定装置2)、结束(固定装置1)。这很正常。我想如果你打印出每个接触事件中涉及的地面固定装置,你会明白我的意思。

如果您想知道车轮何时接触地面,则需要跟踪当前接触的固定装置总数。您可以通过在获得“开始”事件时递增计数器,在获得“结束”事件时递减计数器来实现这一点。然后,您可以随时检查计数器,如果计数器大于零,则车轮接触地面。

 类似资料:
  • 我正在尝试使用LibGDX来掌握游戏开发的窍门,到目前为止,我已经理解了它的一切,因为它是基本的Java,并且很好地使用了接口和超级类。 我正在努力将图形融入到LibGDX项目中,我正在使用Tiled创建地图,我了解它的工作原理以及如何渲染它们。 我也开始进入Box2D学习物理,我能够包装我的地图(平铺的…)用Box2D。 当我尝试从Spine导入项目时,出现了问题,我访问了以下链接:https:

  • 我想创造一个像飞鸟一样的游戏。我想让玩家在屏幕上不断跳跃。我创造了这个代码,它不像一只扑翼鸟跳 代码: 问题是当用户在屏幕上快速点击时,玩家就像火箭一样被击中。当玩家跌倒时,跳跃更低。我该如何解决这个问题,并获得相同的跳跃强度? 我的解决方案:

  • 问题内容: 我刚刚开始使用libgdx创建游戏。它是使用scene2d ui的自上而下的2d射击游戏。现在我想,我可以在某些程度上增加黑暗和光明,但是我不想使用box2d重写所有内容。我不需要逼真的阴影,只需某种环境光和围绕我角色的光圈即可,不受周围墙壁和其他障碍物的影响。所以我想知道libgdx中是否有任何照明系统?或者我可以不使用box2d物体/世界而使用box2dlights吗?谢谢 问题答

  • 问题内容: 我有一个使用FitViewport的尺寸为800x480的游戏世界,最初使用像素来渲染box2d物体+固定装置,因此所有物理效果看起来都是漂浮而缓慢的。通过查看文档,我发现box2d使用度量单位,因此我将box2d的位置和大小转换为32倍,因此最终得到了25x15米的box2d世界。 我遇到的问题是,现在box2d对象变得非常小。如何缩小它们,使它们在屏幕上显示常规尺寸? 问题答案:

  • 为什么这工作正常: 这会产生运行时错误 错误: 这没有任何意义。第一个代码工作正常,三角形画好了,但第二个代码不行。有人能解释一下我做错了什么吗...

  • 这是一个使用box2d的非常简单的场景。我尝试了不同的视口和不同的屏幕尺寸。我不明白为什么尸体下落得很慢。实际上,我不太确定它是否慢,原因可能是视口设置等。这是主类: 和水平屏幕: