2

我成功将 Box2D 安装到我的项目中。但是我怎样才能渲染一个身体呢?假设我正在使用支持绘制多边形的东西。我只想找出身体多边形顶点的当前位置,用引擎绘制它。

如果你能帮助我,我将非常感激。

4

3 回答 3

3

我找到了!!!

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;
        }
    }
}
于 2010-06-24T19:02:42.920 回答
2

Box2D 手册是指下载中捆绑的HelloWorld 项目。相同的文档也逐步完成。引用手册:

该程序创建了一个大的地面盒子和一个小的动态盒子。此代码不包含任何图形。随着时间的推移,您将看到的只是框位置的控制台中的文本输出。

如果你没有一个矩形可以工作,这应该可以帮助你开始。

于 2010-06-24T15:38:32.040 回答
0

您应该使用 World->SetDebugDraw(&myDebugDraw) 并设置适当的绘图标志来渲染物理世界的各个方面(形状、关节、重心等)。绘图标志通过 myDebugDraw.SetDebugFlags(flags) 设置。

myDebugDraw 是 b2Draw 的一个实例(b2DebugDraw 在版本 2.1.2 和之前的版本中),大多数“平台”都有现成的实现。在您的渲染回调期间,使用 World->DrawDebugData() 并且适当的内容将通过您的 myDebugData 实例绘制。

鉴于帖子的简短性,希望这不会让人感到困惑。所有这些都包含在 Box2d 文档中。

于 2011-12-20T22:44:24.363 回答