2

体の1つで重力をオフにしようとしています。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

4 に答える 4

5

私もこの問題にぶつかりました。少し調べてみると、安定した Cocos2D ビルドには最新バージョンの Box2D が含まれていないことがわかりました。これは、Box2D のドキュメントとの不一致を説明しています。

回避策はありますが、Box2D を 2.2.1 (現在最新) に更新することにしました。そうすることで、次の問題が発生しました(解決策付き):

  1. b2PolygonShape.SetAsEdge メソッドはなくなりました。それを使用して画面の境界を定義している場合は、「myPolygonShape.Set(lowerLeftCorner, lowerRightCorner);」のようなものを使用する必要があります。画面の端ごとに。Programmers' Goodiesには、これに関する優れた議論があります。

  2. b2DebugDraw は b2Draw に置き換えられました。b2DebugDraw への呼び出しを b2Draw に置き換えるだけで、設定する必要があります。たとえば、私のように 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));
    }

これが役立つことを願っています!

于 2011-10-24T03:52:08.973 に答える
2

「gravityScale」という名前のメンバーが「b2BodyDef」に存在しないため:(

ドキュメントはコードに比べて古くなっています

于 2011-10-18T15:47:33.247 に答える
1

世界の重力定義を変更します。重力のある世界なので、次のように:

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

世界はb2World

于 2011-09-24T05:03:18.897 に答える
0

body.setGravityScale(0);うまくいかない場合は、2行目で使用できますbody.setAwake(false);

于 2017-09-06T18:21:25.263 に答える