Я тоже столкнулся с этой проблемой. После небольшой копки я обнаружил, что стабильные сборки Cocos2D не включают в себя последние версии Box2D, поэтому gravityScale отсутствует в b2BodyDef. Это объясняет расхождение с документацией Box2D.
Есть обходные пути, но я решил обновить свой Box2D до 2.2.1 (в настоящее время самая последняя версия). При этом я столкнулся со следующими проблемами (с решениями):
Метод b2PolygonShape.SetAsEdge больше не существует. Если вы используете это для определения границ экрана, вам нужно использовать что-то вроде «myPolygonShape.Set (lowerLeftCorner, lowerRightCorner);» для каждого края экрана. Это прекрасное обсуждение на Programmers 'Goodies .
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);
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));
}
Надеюсь, это поможет!