Box2D 中的物体未正确碰撞(LibGDX)
Bodies not colliding properly in Box2D(LibGDX)
所以,在我的游戏中,我有一个带有多边形形状的 box2D 动态 body 作为我的播放器,还有一个带有链形的 box2D 静态 body 作为静态框。调试渲染器正确显示所有框。当玩家从顶部与盒子碰撞时,它会发生碰撞,但当玩家从任何一侧碰撞时,它会向右穿过。我曾尝试对静态框使用多边形,但它的行为很奇怪。我不知道哪里出了问题。
代码如下:
球员body和夹具定义:
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");
静态框body和夹具定义:
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
不应通过 setTransform
完成。设置 DynamicBody
位置最顺畅的方法是通过 MouseJoint
,但它是否对您有帮助取决于您所追求的运动类型。 example 是一个很好的起点。
以这种方式使用接触侦听器来检查碰撞
'if((contact.getFixtureA().getBody() == bodyEdgeScreen &&
contact.getFixtureB().getBody() == body2)
||
(contact.getFixtureA().getBody() == body2 &&
contact.getFixtureB().getBody() == bodyEdgeScreen))'
所以,在我的游戏中,我有一个带有多边形形状的 box2D 动态 body 作为我的播放器,还有一个带有链形的 box2D 静态 body 作为静态框。调试渲染器正确显示所有框。当玩家从顶部与盒子碰撞时,它会发生碰撞,但当玩家从任何一侧碰撞时,它会向右穿过。我曾尝试对静态框使用多边形,但它的行为很奇怪。我不知道哪里出了问题。
代码如下:
球员body和夹具定义:
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");
静态框body和夹具定义:
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
不应通过 setTransform
完成。设置 DynamicBody
位置最顺畅的方法是通过 MouseJoint
,但它是否对您有帮助取决于您所追求的运动类型。 example 是一个很好的起点。
以这种方式使用接触侦听器来检查碰撞
'if((contact.getFixtureA().getBody() == bodyEdgeScreen &&
contact.getFixtureB().getBody() == body2)
||
(contact.getFixtureA().getBody() == body2 &&
contact.getFixtureB().getBody() == bodyEdgeScreen))'