2011-09-23 3 views
1

私の体の1つで重力をオフにしようとしています。私はbodyDef.gravityScale = 0.0fを使用しましたが、私は運がないです。ここで私は以下の私のコードを見ることができます。助けてください。重力を持ってbox2dで重力スケールが機能しないのはなぜですか?

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

答えて

1

世界の変化の重心の定義に、それは世界のだって、 'gravityScale' という名前のメンバーが 'b2BodyDef' に存在しないため

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

世界はb2World

2

次のとおりです。 (

5

私もこの問題にぶつかりました。ちょっと掘り下げた後、安定したCocos2DビルドにはBox2Dの最新バージョンが含まれていないので、gravityScaleはb2BodyDefにはありません。これは、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)); 
    } 

私はこのことができます願っています!

0

body.setGravityScale(0);が機能しない場合は、2行目にbody.setAwake(false);と一緒に使用できます。

関連する問題