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

时间:2012-06-25 02:55:58

标签: java box2d libgdx

我正在使用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;

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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

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