我也遇到过这个问题。经过一番挖掘,我发现稳定的 Cocos2D 构建不包含最新版本的 Box2D,因此 b2BodyDef 中缺少gravityScale。这解释了与 Box2D 文档的差异。
有一些变通方法,但我选择将我的 Box2D 更新到 2.2.1(目前是最新的)。在这样做时,我遇到了以下问题(有解决方案):
b2PolygonShape.SetAsEdge 方法不再存在。如果您使用它来定义屏幕边界,则需要使用“myPolygonShape.Set(lowerLeftCorner, lowerRightCorner);”之类的东西。对于每个屏幕边缘。Programmers' Goodies对此进行了精彩的讨论。
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);
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));
}
我希望这有帮助!