在libgdx中,如何为box2d Body对象添加摩擦力?

我正在用libgdx进行绝对的爆炸,喜欢使用它。 但是,我是box2d的新手,所以我希望比我聪明的人可以帮助我。

我有一个简单的测试屏幕,一堆静态方形瓷砖组成一个地板,一个动态的身体(圆圈)反弹。

我要做的是增加地板的摩擦力,使球不会滚动太多。 就像地板是草而不是木头。

我在网上发现了一些东西,但似乎都没有用。 我尝试过的最有希望的是:

tileBody.getFixtureList().get(0).setFriction(0.9f); 

但似乎什么都不做。

阅读box2d文档表明,当我最初定义对象时,我应该在fixture def上设置摩擦力:

 FixtureDef fdef = new FixtureDef(); fdef.shape = wallshape; fdef.density = 1.0f; fdef.friction = 0.9f; 

然而,这似乎并没有阻止球的滚动。

有更好的方法吗? 我可以减少恢复原状,但那只会阻止它恢复正常吗?

  Body groundBody = world.createBody(groundBodyDef); PolygonShape groundshape = new PolygonShape(); groundshape.setAsBox(30, 1.0f); FixtureDef groundFixture = new FixtureDef(); groundFixture.density=0.0f; groundFixture.shape = groundshape; groundFixture.restitution = .5f; groundFixture.friction=0f; groundBody.createFixture(groundFixture); groundshape.dispose(); 

这对我有用。 如果沿着地面移动的东西有摩擦而不是由暗物质构成,它们应该减速。

这听起来更像是你想要改变圆体的角度阻尼,这取决于它当前正在接触的东西。 角度阻尼会抑制车身的旋转,但不会对直线运动产生任何影响。 您可以通过执行body-> SetAngularDamping(aHighValueLikeSay2to5)并查看您获得的效果来检查这是否是您想要的。

如果看起来不错,那么你需要跟踪圆圈何时接触应该改变角度阻尼的东西。 您可以使用联系人侦听器执行此操作,该侦听器为您提供BeginContact和EndContact通知。 当您收到BeginContact事件时,如果联系人位于您的圈子和应该影响滚动的内容之间,请将计数器递增1。 在EndContact中,执行相同的检查并减少计数器。 这将为您提供一个值,您可以随时检查以确定是否应更改角度阻尼。

我在cocos2d论坛上找到了一个答案。

http://www.cocos2d-iphone.org/forum/topic/17762

似乎圆形状不受box2d中的摩擦影响。

因此,为了适当地将摩擦应用于圆,您最好使用多边形近似圆。