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.

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

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

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.

Videotutorial en YouTube

Comparte este artículo