Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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(LibGDX)中未正确碰撞的实体_Java_Libgdx_Box2d_Shape - Fatal编程技术网

Java Box2D(LibGDX)中未正确碰撞的实体

Java Box2D(LibGDX)中未正确碰撞的实体,java,libgdx,box2d,shape,Java,Libgdx,Box2d,Shape,所以,在我的游戏中,我有一个带有多边形形状的box2D动态实体作为我的玩家,还有一个带有链状形状的box2D静态实体作为静态框。调试渲染器正确显示所有框。当玩家从顶部与盒子相撞时,盒子会相撞,但当玩家从两侧相撞时,盒子会向右移动。我曾尝试将多边形用于静态框,但它的行为很奇怪。我不知道怎么了 代码如下: 球员身体和固定装置定义: bdef=new BodyDef(); bdef.position.set((WIDTH/2+169)/PPM,100/PPM);

所以,在我的游戏中,我有一个带有多边形形状的box2D动态实体作为我的玩家,还有一个带有链状形状的box2D静态实体作为静态框。调试渲染器正确显示所有框。当玩家从顶部与盒子相撞时,盒子会相撞,但当玩家从两侧相撞时,盒子会向右移动。我曾尝试将多边形用于静态框,但它的行为很奇怪。我不知道怎么了

代码如下:

球员身体和固定装置定义:

        bdef=new BodyDef();
        bdef.position.set((WIDTH/2+169)/PPM,100/PPM);
        bdef.type=BodyType.DynamicBody;
        body=world.createBody(bdef);

        PolygonShape shape=new PolygonShape();
        shape.setAsBox(16/PPM,16/PPM);

        fdef=new FixtureDef();
        fdef.shape=shape;
        fdef.filter.categoryBits=B2DVars.BIT_PLAYER;
        fdef.filter.maskBits=B2DVars.BIT_BLOCK;
        body.createFixture(fdef).setUserData("player");
            bdef=new BodyDef();
            fdef=new FixtureDef();
            bdef.type=BodyType.StaticBody;
            bdef.position.set((col+0.5f)*tileSize/PPM,(row+0.5f)*tileSize/PPM);

            ChainShape chainShape=new ChainShape();
            Vector2[] v=new Vector2[5];
            v[0]=new Vector2(-tileSize/2/PPM,-tileSize/2/PPM);
            v[1]=new Vector2(tileSize/2/PPM,-tileSize/2/PPM);
            v[2]=new Vector2(tileSize/2/PPM,tileSize/2/PPM);
            v[3]=new Vector2(-tileSize/2/PPM,tileSize/2/PPM);
            v[4]=new Vector2(-tileSize/2/PPM,-tileSize/2/PPM);
            chainShape.createChain(v);

            fdef.friction=0;
            fdef.shape=chainShape;
            fdef.isSensor=false;
            fdef.filter.categoryBits=B2DVars.BIT_BLOCK;
            fdef.filter.maskBits=B2DVars.BIT_PLAYER;
            world.createBody(bdef).createFixture(fdef).setUserData("block");
静态箱体和夹具定义:

        bdef=new BodyDef();
        bdef.position.set((WIDTH/2+169)/PPM,100/PPM);
        bdef.type=BodyType.DynamicBody;
        body=world.createBody(bdef);

        PolygonShape shape=new PolygonShape();
        shape.setAsBox(16/PPM,16/PPM);

        fdef=new FixtureDef();
        fdef.shape=shape;
        fdef.filter.categoryBits=B2DVars.BIT_PLAYER;
        fdef.filter.maskBits=B2DVars.BIT_BLOCK;
        body.createFixture(fdef).setUserData("player");
            bdef=new BodyDef();
            fdef=new FixtureDef();
            bdef.type=BodyType.StaticBody;
            bdef.position.set((col+0.5f)*tileSize/PPM,(row+0.5f)*tileSize/PPM);

            ChainShape chainShape=new ChainShape();
            Vector2[] v=new Vector2[5];
            v[0]=new Vector2(-tileSize/2/PPM,-tileSize/2/PPM);
            v[1]=new Vector2(tileSize/2/PPM,-tileSize/2/PPM);
            v[2]=new Vector2(tileSize/2/PPM,tileSize/2/PPM);
            v[3]=new Vector2(-tileSize/2/PPM,tileSize/2/PPM);
            v[4]=new Vector2(-tileSize/2/PPM,-tileSize/2/PPM);
            chainShape.createChain(v);

            fdef.friction=0;
            fdef.shape=chainShape;
            fdef.isSensor=false;
            fdef.filter.categoryBits=B2DVars.BIT_BLOCK;
            fdef.filter.maskBits=B2DVars.BIT_PLAYER;
            world.createBody(bdef).createFixture(fdef).setUserData("block");

编辑:问题不再是,这是我通过变换设置播放器位置的问题,但现在我不知道,当我按下按钮时,如何使播放器移动,当我松开按钮时如何停止?

移动
动态主体
不应通过
设置变换
来完成。设置
DynamicBody
位置最平滑的方法是通过
MouseJoint
,但它是否能帮助您取决于您所追求的运动类型。这是一个很好的起点

以这种方式使用contact listener检查冲突

'if((contact.getFixtureA().getBody() == bodyEdgeScreen &&
                        contact.getFixtureB().getBody() == body2)
                        ||
                        (contact.getFixtureA().getBody() == body2 &&
                                contact.getFixtureB().getBody() == bodyEdgeScreen))'

你能添加处理碰撞的代码吗?它是Box2D。库中的冲突不是已经完成了吗?您可以将
ContactListener
添加到您处理冲突的box2d世界中(如wiki中所述:)。从你的评论中,我了解到你没有这样做。