Почему гравитационная шкала не работает в box2d - PullRequest
1 голос
/ 24 сентября 2011

Я пытаюсь отключить гравитацию на одном из моих тел. Я использовал 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 ]

5 голосов
/ 24 октября 2011

Я тоже столкнулся с этой проблемой. После небольшой копки я обнаружил, что стабильные сборки 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). 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));
    }

Надеюсь, это поможет!

2 голосов
/ 18 октября 2011

Поскольку в b2BodyDef нет члена с именем gravityScale: (

документация устарела по сравнению с кодом

1 голос
/ 24 сентября 2011

Измените гравитационное определение мира, потому что это мир, имеющий гравитацию, как:

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

Мир это b2World

0 голосов
/ 06 сентября 2017

Если body.setGravityScale(0); не работает, вы можете использовать его с body.setAwake(false); во второй строке.

...