Flame: Tipos de cuerpos: dinámicos, estáticos y cinemáticos
En Forge2D existen tres tipos diferentes de cuerpos: estáticos, dinámicos y cinemáticos.
Cuerpos estáticos
Los cuerpos estáticos no se mueven, no reaccionan a ninguna fuerza, impulso o colisión. Los cuerpos estáticos son perfectos para representar el suelo, las paredes y cualquier objeto que no necesite moverse.
Vamos a crear una nueva clase llamada FloorStatic
que contiene un cuerpo estático y se encargará de representar el suelo de nuestro mundo:
class FloorStatic extends BodyComponent {
@override
Body createBody() {
final bodyDef = BodyDef(
position: Vector2(0, worldSize.y - .75),
type: BodyType.static,
);
final shape = EdgeShape()..set(Vector2.zero(), Vector2(worldSize.x, 0));
final fixtureDef = FixtureDef(shape);
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
}
Podemos ver que el tipo del cuerpo es BodyType.static
y la forma es EdgeShape
. Este tipo de forma es ideal para representar el suelo porque es un simple segmento de línea.
Ahora agreguemos el objeto FloorStatic
al juego:
class GameLesson02 extends MyGame {
@override
Future<void> onLoad() async {
super.onLoad();
add(FloorStatic());
}
}
Después de ejecutar el código, veremos que hay una línea estática que cruza la pantalla horizontalmente.
![](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fyayo-code-blog-prod.appspot.com%2Fo%2Flocales%252Fes%252Fposts%252F7hp4dLXobT8GJ3NtzVOS%252Fa4bd8d7c-8c4a-49e7-a29a-75ba060f1d49.png%3Falt%3Dmedia%26token%3D71e1bc65-4f0a-453f-a148-b3d42f952d0b&w=800&q=75)
Cuerpos dinámicos
Los cuerpos dinámicos son los que se mueven y son afectados por las fuerzas físicas como la gravedad, impulsos, colisiones y otros eventos del mundo.
Vamos a crear una nueva clase llamada BallDynamic
que contiene un cuerpo dinámico y se encargará de representar una pelota que cae al suelo:
class BallDynamic extends BodyComponent {
@override
Body createBody() {
final bodyDef = BodyDef(
position: Vector2(worldSize.x / 2, 0),
type: BodyType.dynamic,
);
final shape = CircleShape()..radius = .35;
final fixtureDef = FixtureDef(shape);
return world.createBody(bodyDef)..createFixture(fixtureDef);
}
}
En esta ocasión, el tipo del cuerpo es BodyType.dynamic
y la forma es CircleShape
. La pelota se posiciona verticalmente en la parte superior de la pantalla y está centrada horizontalmente.
Agreguemos el objeto BallDynamic
al juego:
class GameLesson02 extends MyGame {
@override
Future<void> onLoad() async {
super.onLoad();
add(FloorStatic());
add(BallDynamic());
}
}
Cuando ejecutamos el código, podemos ver que la pelota cae de arriba hacia abajo hasta llegar al suelo.
![Pelota cayendo desde su posicion inicial](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fyayo-code-blog-prod.appspot.com%2Fo%2Flocales%252Fes%252Fposts%252F7hp4dLXobT8GJ3NtzVOS%252F44291bc6-5952-4bb0-9604-843c3fb2984d.gif%3Falt%3Dmedia%26token%3D3185350a-7dbb-4a66-bf7a-02bd16b6a632&w=800&q=75)
Pelota cayendo desde su posicion inicial
Cuerpos cinemáticos
Los cuerpos cinemáticos son muy similares a los cuerpos estáticos y dinámicos. ¿En qué sentido? Al igual que los cuerpos estáticos, no reaccionan a las fuerzas, pero al igual que los cuerpos dinámicos, pueden moverse. Para mover un cuerpo cinemático, debemos establecer su velocidad o posición.
Creemos la clase BoxKinematic
que contendrá un cuerpo cinemático:
class BoxKinematic extends BodyComponent {
@override
Body create
Body() {
final bodyDef = BodyDef(
position: Vector2(worldSize.x / 2, worldSize.y / 2),
type: BodyType.kinematic,
);
final shape = PolygonShape()..setAsBoxXY(.15, 1.25);
final fixtureDef = FixtureDef(shape);
return world.createBody(bodyDef)
..createFixture(fixtureDef)
..angularVelocity = radians(180);
}
}
En esta ocasión, el tipo de cuerpo es BodyType.kinematic
y la forma es PolygonShape
. La posición del cuerpo está en el centro de la pantalla y tiene una angularVelocity
, lo que significa que rotará sobre su eje.
Agreguemos el objeto BoxKinematic
al juego:
class GameLesson02 extends MyGame {
@override
Future<void> onLoad() async {
super.onLoad();
add(FloorStatic());
add(BallDynamic());
add(BoxKinematic());
}
}
Cuando ejecutamos el código, podemos ver que la pelota cae, colisiona con la caja en rotación y finalmente alcanza el suelo y sale de la pantalla.
![Cuerpo cinemático rotando en el centro de la pantalla](/_next/image?url=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fyayo-code-blog-prod.appspot.com%2Fo%2Flocales%252Fes%252Fposts%252F7hp4dLXobT8GJ3NtzVOS%252Fabac5621-ae6f-4dda-b4b2-9e01397bb0e8.gif%3Falt%3Dmedia%26token%3D7e2179b6-2b25-4f74-9dd2-7ed0a6184690&w=800&q=75)
Cuerpo cinemático rotando en el centro de la pantalla
Ten en cuenta que el cuerpo cinemático no se ve afectado por la gravedad ni por la colisión con la pelota. Siempre se mantendrá en la misma posición.
Importante
Recuerda que Forge2D trabaja con radianes y no con grados.
Conclusión
Forge2D proporciona diferentes tipos de cuerpos para simular distintos comportamientos físicos en un mundo de simulación.
Los cuerpos estáticos no se mueven y son ideales para representar objetos inmóviles como el suelo y las paredes. Los cuerpos dinámicos son afectados por fuerzas físicas como la gravedad y pueden moverse en respuesta a ellas. Por último, los cuerpos cinemáticos pueden ser controlados manualmente estableciendo su posición o velocidad.
Por último, recuerda que puedes encontrar el código fuente de todos los tutoriales en Github, y también puedes probar todos los ejemplos en tu navegador.