我正在使用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;
然而,这似乎并没有阻止球滚动。
有更好的方法吗?我可以减少恢复原状,但那只会阻止它弹跳那么多吗?
答案 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中的摩擦影响。
因此,为了正确地将摩擦力应用于圆形,您最好使用多边形近似圆形。