我正在使用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)、开始(固定装置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的非常简单的场景。我尝试了不同的视口和不同的屏幕尺寸。我不明白为什么尸体下落得很慢。实际上,我不太确定它是否慢,原因可能是视口设置等。这是主类: 和水平屏幕: