Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Box2D库-为什么碰撞不会发生';当一个动态物体卡在一个静态物体和另一个动态物体之间时,它不能正常工作?_Java_C++_Libgdx_Box2d - Fatal编程技术网

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

如果你能分享一些代码就好了。因为现在很难以某种方式帮助你。我添加了一张情况照片^^如果你能分享一些代码就好了。因为现在很难以某种方式帮助你。我添加了一张情况照片^^