【问题标题】:Bodies not colliding properly in Box2D(LibGDX)Box2D(LibGDX)中的物体没有正确碰撞
【发布时间】:2015-04-25 07:47:25
【问题描述】:

所以,在我的游戏中,我有一个带有多边形形状的 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");

编辑:问题不再存在,我通过变换设置播放器位置是个问题,但现在我不知道,当我按下按钮时如何让播放器移动并在释放它时停止?

【问题讨论】:

  • 你能添加处理碰撞的代码吗?
  • 这是 Box2D。库中的碰撞不是已经完成了吗?
  • 您可以在处理碰撞的 box2d 世界中添加ContactListener(如 wiki 中所述:github.com/libgdx/libgdx/wiki/box2d#contact-listeners)。根据您的评论,我了解到您没有这样做。

标签: java libgdx box2d shape


【解决方案1】:

不应通过setTransform 移动DynamicBody。设置DynamicBody 位置最流畅的方法是通过MouseJoint,但它是否对您有帮助取决于您所追求的运动类型。这个example 是一个很好的起点。

【讨论】:

    【解决方案2】:

    以这种方式使用接触监听器来检查碰撞

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多