【问题标题】:Why doesn't gravity scale work in box2d为什么重力秤在 box2d 中不起作用
【发布时间】:2011-09-23 22:27:00
【问题描述】:

我正在尝试关闭我的一个身体的重力。我使用了 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);

【问题讨论】:

    标签: iphone xcode box2d gravity


    【解决方案1】:

    我也遇到过这个问题。经过一番挖掘,我发现稳定的 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);
      

    用这个:

        // 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)。定义为 b2Mat22 的 myTransform.R 已替换为定义为 b2Rot 的 myTransform.q。同样,如果您使用的是 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));
      }
      

    …与:

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

    我希望这会有所帮助!

    【讨论】:

      【解决方案2】:

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

      文档与代码相比已经过时了

      【讨论】:

        【解决方案3】:

        改变世界的重力定义,因为它是世界,有重力,作为:

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

        世界是b2World

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2023-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多