Box2Dをプロジェクトにインストールすることに成功しました。しかし、どうすればボディをレンダリングできますか?ポリゴンの描画をサポートするものを使用していると仮定します。ボディポリゴンの頂点の現在の位置を調べて、エンジンで描画したいだけです。
あなたが私を助けることができれば、私は非常に感謝します。
見つけた!!!
void Box2DUtils::DrawBody(SDL_Surface *buffer, b2Body *body, int fr, int fg, int fb, int falpha, int lr, int lg, int lb, int lalpha, bool aa)
{
const b2Transform& xf = body->GetTransform();
for (b2Fixture* f = body->GetFixtureList(); f; f = f->GetNext())
{
switch (f->GetType())
{
case b2Shape::e_circle:
{
b2CircleShape* circle = (b2CircleShape*) f->GetShape();
b2Vec2 center = b2Mul(xf, circle->m_p);
float32 radius = circle->m_radius;
b2Vec2 axis = xf.R.col1;
//m_debugDraw->DrawSolidCircle(center, radius, axis, color);
if (falpha > 0)
{
filledCircleRGBA(buffer, center.x, center.y, (int) radius, fr, fg, fb, falpha);
}
if (lalpha > 0)
{
if (aa)
{
aacircleRGBA(buffer, center.x, center.y, (int) radius, lr, lg, lb, lalpha);
} else
{
aacircleRGBA(buffer, center.x, center.y, (int) radius, lr, lg, lb, lalpha);
}
} else if (aa)
{
aacircleRGBA(buffer, center.x, center.y, (int) radius, fr, fg, fb, falpha);
}
}
break;
case b2Shape::e_polygon:
{
b2PolygonShape* poly = (b2PolygonShape*) f->GetShape();
int32 vertexCount = poly->m_vertexCount;
b2Assert(vertexCount <= b2_maxPolygonVertices);
b2Vec2 vertices[b2_maxPolygonVertices];
Sint16 xv[b2_maxPolygonVertices];
Sint16 yv[b2_maxPolygonVertices];
for (int32 i = 0; i < vertexCount; ++i)
{
vertices[i] = b2Mul(xf, poly->m_vertices[i]);
xv[i] = (int) vertices[i].x;
yv[i] = (int) vertices[i].y;
}
if (falpha > 0)
{
filledPolygonRGBA(buffer, xv, yv, (Sint16) vertexCount, fr, fg, fb, falpha);
}
if (lalpha > 0)
{
if (aa)
{
aapolygonRGBA(buffer, xv, yv, (Sint16) vertexCount, lr, lg, lb, lalpha);
} else
{
polygonRGBA(buffer, xv, yv, (Sint16) vertexCount, lr, lg, lb, lalpha);
}
} else if (aa)
{
aapolygonRGBA(buffer, xv, yv, (Sint16) vertexCount, fr, fg, fb, falpha);
}
//m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color);
}
break;
}
}
}
Box2D マニュアルは、ダウンロードにバンドルされている HelloWorld プロジェクトを参照しています。同じドキュメントでも、段階的に説明されています。マニュアルの引用:
プログラムは、大きなグラウンド ボックスと小さなダイナミック ボックスを作成します。このコードにはグラフィックは含まれていません。表示されるのは、時間の経過に伴うボックスの位置のコンソールのテキスト出力だけです。
作業する四角形がない場合は、これで作業を開始できます。
World->SetDebugDraw(&myDebugDraw) を使用し、適切な描画フラグを設定して、物理世界のさまざまな側面 (形状、関節、重心など) をレンダリングする必要があります。描画フラグは、myDebugDraw.SetDebugFlags(flags) を介して設定されます。
myDebugDraw は b2Draw (バージョン 2.1.2 以前の b2DebugDraw) のインスタンスであり、ほとんどの「プラットフォーム」ですぐに利用できる実装があります。レンダリング コールバック中に World->DrawDebugData() を使用すると、myDebugData のインスタンスを介して適切なコンテンツが描画されます。
投稿の短さを考えると、これが混乱を招くものではないことを願っています. これはすべて、Box2d のドキュメントで説明されています。