Java Box2D库-为什么碰撞不会发生';当一个动态物体卡在一个静态物体和另一个动态物体之间时,它不能正常工作?
例如,一个动态实体位于拐角处,并且正在无限向该拐角处的墙(需要是静态实体)移动。如果另一个物体朝同一方向行走,并与第一个物体碰撞,碰撞将完全忽略。这是唯一发生这种情况的情况 下面是照片: 下一步,绿色矩形与红色球体重叠。如果没有静止物体,碰撞可以正常进行Java Box2D库-为什么碰撞不会发生';当一个动态物体卡在一个静态物体和另一个动态物体之间时,它不能正常工作?,java,c++,libgdx,box2d,Java,C++,Libgdx,Box2d,例如,一个动态实体位于拐角处,并且正在无限向该拐角处的墙(需要是静态实体)移动。如果另一个物体朝同一方向行走,并与第一个物体碰撞,碰撞将完全忽略。这是唯一发生这种情况的情况 下面是照片: 下一步,绿色矩形与红色球体重叠。如果没有静止物体,碰撞可以正常进行 提前感谢。这是Box2D特有的。如果一个动态体垂直向另一个动态体移动,并且在其路径上有一个静态体,则动态体将彼此重叠。 要修复此错误,可以使用contact listener捕捉实体碰撞的时刻,并根据红色实体的位置直接设置绿色实体的位置。诸如
提前感谢。这是Box2D特有的。如果一个动态体垂直向另一个动态体移动,并且在其路径上有一个静态体,则动态体将彼此重叠。 要修复此错误,可以使用contact listener捕捉实体碰撞的时刻,并根据红色实体的位置直接设置绿色实体的位置。诸如此类:
public class CoreClass extends Game {
Array<Body> bodies = new Array<Body>();
World world = new World(new Vector2(0.0f, 0.0f), true);
Body bodyRed;
Body bodyGreen;
private float prevX;
private float prevY;
@Override
public void create() {
BodyDef bodyBD = new BodyDef();
bodyBD.type = BodyType.DynamicBody;
FixtureDef bodyFD = new FixtureDef();
bodyFD.density = 1.0f;
bodyFD.friction = 1.0f;
bodyFD.restitution = 1.0f;
bodyRed = world.createBody(bodyBD);
bodyGreen = world.createBody(bodyBD);
bodyRed.createFixture(bodyFD);
bodyGreen.createFixture(bodyFD);
prevX = bodyGreen.getPosition().x; prevY = bodyGreen.getPosition().y;
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
world.getBodies(bodies);
bodies.get(contact.getChildIndexA()).getPosition().set(prevX, prevY);
}
@Override
public void endContact(Contact contact) {
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
}
@Override
public void render() {
super.render();
prevX = bodyGreen.getPosition().x;
prevY = bodyGreen.getPosition().y;
world.step(1/45f, 2, 6);
}
公共类CoreClass扩展游戏{
数组体=新数组();
世界世界=新世界(新矢量2(0.0f,0.0f),真);
身体红色;
体绿;
私人浮动prevX;
私人浮动汇率;
@凌驾
公共void create(){
BodyDef bodyBD=新的BodyDef();
bodyBD.type=BodyType.DynamicBody;
FixtureDef bodyFD=新的FixtureDef();
车身密度=1.0f;
车身摩擦力=1.0f;
bodyFD.restoration=1.0f;
bodyRed=world.createBody(bodyBD);
bodyGreen=world.createBody(bodyBD);
bodyRed.createFixture(bodyFD);
bodyGreen.createFixture(bodyFD);
prevX=bodyGreen.getPosition().x;prevY=bodyGreen.getPosition().y;
setContactListener(新的ContactListener(){
@凌驾
public void beginContact(联系人){
世界卫生组织(机构);
bodies.get(contact.getChildIndexA()).getPosition().set(prevX,prevY);
}
@凌驾
公共无效endContact(联系人){
}
@凌驾
公共无效预解(触点触点、歧管、歧管){
}
@凌驾
公共无效后处理(触点接触、触点脉冲){
}
});
}
@凌驾
公共无效呈现(){
super.render();
prevX=bodyGreen.getPosition().x;
prevY=bodyGreen.getPosition().y;
世界.步骤(1/45f、2、6);
}
这是Box2D特有的。如果一个动态实体垂直向另一个动态实体移动,并且在其路径上有一个静态实体,则动态实体无论如何都会相互重叠。
要修复此错误,您可以使用contact listener捕捉物体碰撞的时刻,并根据红色物体的位置直接设置绿色物体的位置。类似于:
public class CoreClass extends Game {
Array<Body> bodies = new Array<Body>();
World world = new World(new Vector2(0.0f, 0.0f), true);
Body bodyRed;
Body bodyGreen;
private float prevX;
private float prevY;
@Override
public void create() {
BodyDef bodyBD = new BodyDef();
bodyBD.type = BodyType.DynamicBody;
FixtureDef bodyFD = new FixtureDef();
bodyFD.density = 1.0f;
bodyFD.friction = 1.0f;
bodyFD.restitution = 1.0f;
bodyRed = world.createBody(bodyBD);
bodyGreen = world.createBody(bodyBD);
bodyRed.createFixture(bodyFD);
bodyGreen.createFixture(bodyFD);
prevX = bodyGreen.getPosition().x; prevY = bodyGreen.getPosition().y;
world.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
world.getBodies(bodies);
bodies.get(contact.getChildIndexA()).getPosition().set(prevX, prevY);
}
@Override
public void endContact(Contact contact) {
}
@Override
public void preSolve(Contact contact, Manifold oldManifold) {
}
@Override
public void postSolve(Contact contact, ContactImpulse impulse) {
}
});
}
@Override
public void render() {
super.render();
prevX = bodyGreen.getPosition().x;
prevY = bodyGreen.getPosition().y;
world.step(1/45f, 2, 6);
}
公共类CoreClass扩展游戏{
数组体=新数组();
世界世界=新世界(新矢量2(0.0f,0.0f),真);
身体红色;
体绿;
私人浮动prevX;
私人浮动汇率;
@凌驾
公共void create(){
BodyDef bodyBD=新的BodyDef();
bodyBD.type=BodyType.DynamicBody;
FixtureDef bodyFD=新的FixtureDef();
车身密度=1.0f;
车身摩擦力=1.0f;
bodyFD.restoration=1.0f;
bodyRed=world.createBody(bodyBD);
bodyGreen=world.createBody(bodyBD);
bodyRed.createFixture(bodyFD);
bodyGreen.createFixture(bodyFD);
prevX=bodyGreen.getPosition().x;prevY=bodyGreen.getPosition().y;
setContactListener(新的ContactListener(){
@凌驾
public void beginContact(联系人){
世界卫生组织(机构);
bodies.get(contact.getChildIndexA()).getPosition().set(prevX,prevY);
}
@凌驾
公共无效endContact(联系人){
}
@凌驾
公共无效预解(触点触点、歧管、歧管){
}
@凌驾
公共无效后处理(触点接触、触点脉冲){
}
});
}
@凌驾
公共无效呈现(){
super.render();
prevX=bodyGreen.getPosition().x;
prevY=bodyGreen.getPosition().y;
世界.步骤(1/45f、2、6);
}
如果你能分享一些代码就好了。因为现在很难以某种方式帮助你。我添加了一张情况照片^^如果你能分享一些代码就好了。因为现在很难以某种方式帮助你。我添加了一张情况照片^^