Box2D: ¿Cómo hacen manualmente un cuerpo
Pregunta
tengo éxito la instalación de Box2D en mi proyecto. Pero, ¿cómo puedo hacer que un cuerpo? Asumo que estoy usando algo que los soportes de dibujo de polígonos. Sólo quiero averiguar las posiciones actuales de los vértices del polígono cuerpo, para dibujar con el motor.
Si usted me puede ayudar, estaré muy agradecido.
Solución
lo encontré !!!
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;
}
}
}
Otros consejos
El manual Box2D se refiere a un proyecto HelloWorld que se incluye en la descarga. La misma documentación también pasa a través de él paso a paso. Citando el manual:
El programa crea una caja de tierra grande y una pequeña cuadro dinámico. Este código no lo hace contener cualquier gráfico. Todo lo que se verá es la salida de texto en la consola de la La posición de la caja con el tiempo.
Si usted no ha conseguido un rectángulo para el trabajo, esto debería ayudar a empezar.
Debe utilizar Mundo-> SetDebugDraw (y myDebugDraw) y establecer las banderas de dibujo apropiadas para hacer que los diversos aspectos del mundo de la física (formas, juntas, centro de gravedad, etc.) banderas de dibujo se establecen a través de myDebugDraw.SetDebugFlags (banderas ).
myDebugDraw es una instancia de b2Draw (b2DebugDraw en versiones 2.1.2 y anteriores) que la mayoría de "plataformas" tienen una aplicación fácilmente disponibles. Durante su devolución de llamada representación, utilice World-> DrawDebugData () y el contenido apropiado será dibujado a través de la instancia de myDebugData.
Esperamos que esto no iba a confusión, pues la brevedad del mensaje. Todo esto está cubierto en la documentación Box2D.