为什么重力比例在box2d中不起作用

时间:2011-09-23 22:27:01

标签: iphone xcode box2d gravity

我试图在我的一个身体上关闭引力。我使用了bodyDef.gravityScale = 0.0f,但我没有运气。在这里,您可以查看下面的代码。请帮忙。

    b2BodyDef monkey1BodyDef;
    monkey1BodyDef.position.Set(0, 200/PTM_RATIO);
    monkey1BodyDef.type = b2_dynamicBody;
    monkey1BodyDef.userData = monkey1;
    monkey1BodyDef.bullet = true;
    monkey1BodyDef.gravityScale = 0.0f; //Why doesn't this work I get an error that says no member named 'gravityScale' in 'b2BodyDef'
    b2Body *monkey1Body = world->CreateBody(&monkey1BodyDef);

4 个答案:

答案 0 :(得分:5)

我也遇到了这个问题。经过一番挖掘后,我发现稳定的Cocos2D版本不包含最新版本的Box2D,因此b2BodyDef缺少gravityScale。这解释了与Box2D文档的差异。

有解决方法,但我选择将我的Box2D更新为2.2.1(目前是最新的)。在这样做时,我遇到了以下问题(使用解决方案):

  1. b2PolygonShape.SetAsEdge方法不再存在。如果您使用它来定义屏幕边界,则需要使用类似“myPolygonShape.Set(lowerLeftCorner,lowerRightCorner);”的内容。对于每个屏幕边缘。在Programmers' Goodies对此进行了很好的讨论。

  2. b2DebugDraw已被b2Draw取代。只需用b2Draw替换对b2DebugDraw的任何调用,就应该设置。例如,如果像我一样使用Cocos2D Box2D模板,则需要替换它:

    // Debug Draw functions
    m_debugDraw = new GLESDebugDraw( PTM_RATIO );
    _world->SetDebugDraw(m_debugDraw);
    
    uint32 flags = 0;
    flags += b2DebugDraw::e_shapeBit;
    flags += b2DebugDraw::e_centerOfMassBit;
    m_debugDraw->SetFlags(flags);
    
  3. 用这个:

        // Debug Draw functions
        m_debugDraw = new GLESDebugDraw( PTM_RATIO );
        _world->SetDebugDraw(m_debugDraw);
    
        uint32 flags = 0;
        flags += b2Draw::e_shapeBit;
        flags += b2Draw::e_centerOfMassBit;
        m_debugDraw->SetFlags(flags);
    
    1. b2Transform具有不同的位置和旋转属性名称。例如,myTransform.position现在是myTransform.p(但仍然是b2Vec2)。 myTransform.R(定义为b2Mat22)已替换为myTransform.q,定义为b2Rot。同样,如果您使用的是Cocos2D Box2D模板,请在GLES-Render.mm中替换以下内容:

      void GLESDebugDraw::DrawTransform(const b2Transform& xf)
      {
      b2Vec2 p1 = xf.position, p2;
      const float32 k_axisScale = 0.4f;
      
      p2 = p1 + k_axisScale * xf.R.col1;
      DrawSegment(p1,p2,b2Color(1,0,0));
      
      p2 = p1 + k_axisScale * xf.R.col2;
      DrawSegment(p1,p2,b2Color(0,1,0));
      }
      
    2. ...与:

          void GLESDebugDraw::DrawTransform(const b2Transform& xf)
          {
          b2Vec2 p1 = xf.p, p2;
          const float32 k_axisScale = 0.4f;
      
          p2 = p1 + k_axisScale * xf.q.GetXAxis();
          DrawSegment(p1,p2,b2Color(1,0,0));
      
          p2 = p1 + k_axisScale * xf.q.GetXAxis();
          DrawSegment(p1,p2,b2Color(0,1,0));
          }
      

      我希望这有帮助!

答案 1 :(得分:2)

因为'b2BodyDef'中不存在名为'gravityScale'的成员:(

与代码相比,

文档已过时

答案 2 :(得分:1)

改变世界的重力定义,因为它具有引力,因为:

b2Vec2 gravity = b2Vec2(0.0f, -10.0f);
bool doSleep = false;
world = new b2World(gravity, doSleep);

世界是b2World

答案 3 :(得分:0)

如果body.setGravityScale(0);不起作用,您可以在第二行使用body.setAwake(false);