私もこの問題にぶつかりました。少し調べてみると、安定した Cocos2D ビルドには最新バージョンの Box2D が含まれていないことがわかりました。これは、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 です)。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));
}
これが役立つことを願っています!