2

我对 libgdx 非常满意,喜欢使用它。但是,我是 box2d 的新手,所以我希望比我更聪明的人能帮助我。

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

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

我在网上找到了一些东西,但似乎都没有。我尝试过的最有希望的事情是:

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

但它似乎什么也没做。

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

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

然而,这似乎也不能阻止球滚动。

有没有更好的方法来做到这一点?我可以减少恢复原状,但这只会阻止它反弹,对吗?

4

3 回答 3

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

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

于 2013-12-03T01:38:03.453 回答
1

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

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

于 2012-06-25T05:29:39.377 回答
0

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

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

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

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

于 2012-06-26T18:31:19.743 回答