为什么重力刻度在 box2d 中不起作用



我正在尝试关闭我身体上的重力。我已经使用了bodyDef。重力秤= 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);

我也遇到过这个问题。经过一番挖掘,我发现稳定的Cocos2D构建不包括最新版本的Box2D,所以b2BodyDef中缺少gravityScale。这就解释了与Box2D文档的差异。

有解决方法,但我选择将我的Box2D更新到2.2.1(目前最新的)。在这样做的过程中,我遇到了以下问题(与解决方案):

  1. b2PolygonShape。SetAsEdge方法不再存在。如果你用它来定义屏幕边界,你需要使用类似"myPolygonShape"的东西。为每个屏幕边缘设置(lowerLeftCorner, lowerRightCorner);在"程序员的好东西"上有一个很好的讨论。

  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。位置现在是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));
    }
    

…:

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

我希望这对你有帮助!

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

与代码
相比,

文档已经过时了

改变world的重力定义,因为它是world,有重力,As:

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

世界是b2World

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

最新更新