Armando un juego con fisica en Python, Pygame y Pymunk (y II)

En un artículo anterior hablamos de cómo comenzar a utilizar la librería Pymunk y Pygame para hacer simulaciones de movimiento de cuerpos rígidos, utilizando gráficos de líneas sencillos. Nos quedó pendiente hablar sobre los casos en los que necesitamos un poco más de complejidad, cuando queremos utilizar sprites dentro del juego. Luego de hablar sobre lo que tenemos que saber para utilizarlos, hablaremos sobre cómo montar un juego de plataformas utilizando Pymunk.

Jedi Chicken Hell
Fig. 1 - Jedi Chicken Hell, por Javier Gutierrez, Jesús Vasquez y Juan Seijo.

¿Cómo integro Pymunk con los sprites de PyGame?

En PyGame tenemos el concepto de Sprites: elementos que se dibujan en pantalla, que tienen una posición, y una rotación. En Pymunk tenemos dos conceptos: el de Body, que es el centro de gravedad del objeto, y el de Shape, que es la figura que acompaña al centro de gravedad. Para integrar los Sprites con Pymunk, tenemos que echar un poco de cabeza para pensar en las traslaciones y rotaciones de los sprites para que coincidan con los cuerpos.

¿Por qué?, porque tanto Pymunk como Pygame representan dos sistemas de coordenadas, que hay que igualar para que el movimiento se vea correctamente. Por ejemplo, si colocamos una gravedad negativa, digamos -10, y las coordenadas en Pymunk las representamos tal cual como Pygame las utiliza, veremos que los objetos caerán “hacia arriba”. Recordemos que el sistema de coordenadas de Pygame tiene su origen en la esquina superior izquierda de la ventana, con el eje x aumentando hacia su derecha, y el eje hacia abajo, como lo veremos a continuación.

Diagrama de coordenadas de Pygame
Fig. 2 - Sistema de coordenadas de PyGame, con respecto a la ventana que contiene al juego
Coordenadas de Pymunk
Fig. 3 - Sistema de coordenadas de Pymunk. Las coordenadas que se le dan a los Shapes se hacen con respecto al centro de gravedad del cuerpo.

Los Sprites de PyGame le dan al jugador la idea de la forma que tiene el cuerpo visualmente, mientras que los Shapes (las formas) en Pymunk son la representación dentro de la simulación física. Por razones de simplicidad, y esto es lo que suele predominar, se suele ajustar una figura muy simple a un sprite, como un rectángulo. En la figura a continuación se muestra cómo se puede adaptar un Shape de Pymunk (dibujado en negro) a un sprite (dibujado completamente en rojo).

Cómo acomodar un shape de Pymunk con un sprite
Fig. 4 - Se puede hacer un Shape rectangular para acomodar al Sprite (demostrado con la línea negra) o un Shape con una forma más realista. Esto tiene su costo en la simulación.

Por otro lado, en Pymunk tenemos que declarar las coordenadas de un Shape con respecto a su centro de gravedad (ver Figura 3), y el origen de un sprite está en su esquina superior izquierda. Luego, si rotamos con pygame.sprite.rotate vamos a rotar en base a la esquina y no al centro de gravedad. Luego tenemos que mover el centro de rotación hacia el centro de gravedad del sprite.

¿Cómo elaboro un juego de plataformas con Pymunk?

Un juego de plataformas con física 2D realista necesita que sus componentes se comporten como tal. Tendríamos una parte gráfica hecha con Pygame, y el comportamiento del objeto mismo con Pymunk. Damos como ejemplo el juego cuyo screenshot está al inicio de este artículo, Jedi Chicken Hell, el cual tiene algunos elementos físicos incorporados al juego de plataformas, y se puede descargar por este enlace.

En este caso todos los elementos del juego tienen una información gráfica, como el sprite que utilizan y qué transformaciones gráficas emplea, y una información física, que es la que hemos explicado en estos artículos.

Otro ejemplo concreto: un defensor de asteroides Esto es un prototipo de juego de defensa de asteroides. En este juego, los asteroides caen por gravedad y golpean las esquinas, para luego caer por el hueco que está dispuesto debajo. La nave gira hacia la derecha o la izquierda, y está fija en ese punto. De esta manera, cuando los asteroides le golpean, la nave comienza a girar rápidamente, aunque no se sale de su lugar. Puedes descargar el código en Python de este juego aquí. (rar, 7.22MB)

La mayoría del código lo he dejado en los paquetes, para que puedan ser estudiados por los lectores. Espero que les sea de utilidad.

8 comentarios sobre “Armando un juego con fisica en Python, Pygame y Pymunk (y II)”

  1. me sale error en pymunk.init_pymunk().
    pm.init_pymunk()
    AttributeError: ‘module’ object has no attribute ‘init_pymunk’

    tengo python 2.7 y pygame 2.7 y pymunk-4.0.0

Deja un comentario