elchiguireliterario.com http://www.elchiguireliterario.com/2011/07/12/armando-un-juego-con-fisica-en-pythonpygame-y-pymunk-i/ Armando un juego con fisica en Python, Pygame y Pymunk (I) En El Chigüire Literario siempre he recomendado a aquellos que están haciendo un juego por primera vez en su vida que desarrollen un juego en 2D. La reacción suele ser adversa: desarrollar un juego en 2D es como volver al pasado, en una época en la que existen los juegos 3D y han adquirido un realismo notable. Supongo que a esta percepción le debemos sumar la visión del juego 2D como el juego vieja escuela (pensemos en MegaMan) donde la sensación de juego es como la de un arcade, en contraste con los juegos en 3D ricos en interacciones físicas que se asemejan a la realidad. La buena noticia es que esto no se limita solamente al 3D. Se han hecho excelentes librerías para tener simulaciones físicas para el caso 2D que se sientan reales. Una de estas librerías es la ya famosa Box2D, por Eric Catto, utilizada principalmente en el juego Angry Brids. Otra librería muy completa, que es la que reseñaremos en este post, es Chipmunk. Chipmunk es una librería de física de cuerpos rígidos en 2D escrita en C. Para algunos universitarios la mención de “física de cuerpos rígidos” puede causarles dolor en su cuerpo (valga el mal juego de palabras ), pero para fines de este tutorial, lo único que tenemos que comprender son los conceptos que introduce la librería y cómo se deben utilizar para nuestros fines. Al estar escrita la librería en C, significa que hay una gran diversidad de bindings a otros lenguajes de programación, por lo que podemos usar esta librería escribiendo código en el lenguaje de nuestra preferencia. Como en este sitio nos gusta Python y PyGame, aprovecharemos Pymunk, el binding para Python que tiene Chipmunk. Es tan fácil de instalar como PyGame, por lo que en pocos instantes vas a tener el poder de crear juegos con interacciones físicas realísticas y sin tener que aprender un montón de conceptos antes de comenzar. ¿Qué conceptos? Para utilizar Pymunk hay que comprender unos conceptos propios de un simulador de cuerpos rigidos. Los 4 principales son: Space (Espacio) – Todos los fenómenos ocurren dentro de un espacio, que no es más que un sistema de coordenadas. Es tarea del desarrollador que el sistema de coordenadas del espacio corresponda al de la pantalla. Cuando hablemos de Pygame lo explicaremos mejor. locals import * from pygame.gravity = (0. Como la inercia de un cuerpo suele venir dada por la figura. La masa es la cantidad de materia en el cuerpo.color import * import pymunk # Importamos Pymunk def main(): pygame. Joint (Junta) – Los joints proveen restricciones al movimiento de los cuerpos.exit(main()) ¿Qué relación tiene con PyGame? .event. Los scripts que veremos a continuación están basados en el tutorial SlideAndPinJointsExample de la página de Pymunk.0) # Colocamos gravedad: una fuerza constante en el tiempo while running: for event in pygame. 600)) pygame. -900. Un cuerpo con muchísima masa será casi inamovible por cualquier fuerza.display.0 de cada segundo pygame. Una vez hecho eso.0) # Hacemos que la simulación corra 1/50. En el caso de 2 dimensiones. y un cuerpo con muchísima inercia será muy difícil de hacer girar.tick(50) # Como este loop corre 50 veces por segundo.py install” en el directorio descomprimido del proyecto.0. Existe una diversidad de juntas para múltiples necesidades.Body (Cuerpo) – Todos los cuerpos dentro de un espacio tienen propiedades físicas. asumiendo que tenemos instalado Python y Pygame.type == KEYDOWN and event.init_pymunk() # Inicializamos Pymunk space = pymunk. Esta figura puede ser un círculo. En todos los casos la forma tiene un “offset” que es el centro de gravedad del cuerpo. hay que instalar Pymunk. Si han visto alguna materia sobre física de cuerpos unidimensionales.get(): if event. ¿Cómo nos iniciamos? Para comenzar. Otro caso puede ser limitar el ángulo de movimiento de esa barra. En Windows es tan sencillo como descargar el instalador de la página de descargas.Space() # Creamos el Space space.key == K_ESCAPE: running = False screen.fill(THECOLORS["white"]) space.display.step(1/50. Los cuerpos en Pymunk no tienen esta información. y en Linux se descarga la fuente y se instala con el procedimiento de ejecutar “python setup.init() screen = pygame. reconocerán que esto es lo mismo.type == QUIT: running = False elif event. tenemos la masa y tenemos la inercia. import sys import pygame from pygame.Clock() running = True pymunk. Shape (Forma) – La forma es la figura que adopta el cuerpo. Son dos propiedades distintas: un cuerpo puede tener una masa tan grande que no se pueda mover y aún así tener muy poca inercia para girarse (ver el caso de una barra atravesada por un clavo de tal manera que un punto está fijo en la pared pero la barra puede girar libremente). estimamos que este código se com if __name__ == '__main__': # __name__ solo tiene el valor '__main__' cuando este script se c sys. y para Pymunk indica qué tanta fuerza hay que aplicar en centro de gravedad para moverlo. la inercia representa la cantidad de fuerza que hay que aplicar en el cuerpo para que éste rote sobre su centro de gravedad.set_caption("Pymunk test") clock = pygame.set_mode((600. Otro caso puede ser conectar dos engranajes. Por otro lado. un rectángulo o un polígono convexo. Un caso que ya mencionamos es el de la barra fija a la pared mediante un clavo. No hemos hablado de la forma que puede tener el cuerpo. son entes que no pueden existir en el espacio si no vienen acompañados de una forma.display. podemos escribir un pequeño script que nos haga probar que pymunk se puede importar bien. Pymunk tiene métodos para hacer un cálculo aproximado de esa inercia.time.flip() clock. type == KEYDOWN and event. p. shape) # Tnato el cuerpo como su forma se agregan al espacio return shape def draw_ball(screen.event.0. int(ball. 0.Space() # Creamos el Space space.position.randint(120.body. 600-int(ball.color import * import pymunk def add_ball(space): # Esta funcion agrega una esfera mass = 1 radius = 14 inertia = pymunk. 2) realizar alguna tarea relacionada con el producto de las colisiones entre elementos de Pymunk.time.380) body.Circle(body.0) # Colocamos gravedad: una fuerza constante en el tiempo balls = [] ticks_to_next_ball = 10 while running: for event in pygame.fill(THECOLORS["white"]) for ball in balls: draw_ball(screen.key == K_ESCAPE: running = False ticks_to_next_ball -= 1 if ticks_to_next_ball <= 0: ticks_to_next_ball = 25 ball_shape = add_ball(space) balls.flip() clock.display. radius) # Al cuerpo le asignamos una forma space.position = x.Pymunk ofrece una simulación bastante precisa (para nuestros fines) del movimiento de cuerpos rígidos.Clock() running = True pymunk.moment_for_circle(mass. 600)) pygame.locals import * from pygame.draw. 2) def main(): pygame.append(ball_shape) screen.position.set_mode((600.display.. ball) space. En el siguiente articulo veremos como utilizar los sprites de Pygame para tener una .Body(mass. PyGame en este caso sería el encargado de: 1) hacer la representación en pantalla de la simulación (algo tan sencillo como líneas y puntos.radius).init() screen = pygame.type == QUIT: running = False elif event. -900. Hasta aca llegamos con el articulo de hoy sobre Pymunk.. 550 # Le asignamos una posicion al azar en el eje horizontal shape = pymunk.y) pygame. 3) establecer el timer para ejecutar la simulación paso por paso en el tiempo (con el objeto Clock). Expandiremos el ejemplo anterior colocando un generador de esferas en el loop y dibujándolo con las funciones de Pygame: import sys import pygame from pygame. radius) # Por lo general la inercia se saca por body = pymunk.x).0) pygame. THECOLORS["blue"]. Los scripts que aparecen en este articulo se pueden descargar aqui.step(1/50.circle(screen.gravity = (0.exit(main()) Y en el proximo capitulo.get(): if event.body. como producir sonido o lanzar algún evento. inertia) # Creamos el cuerpo x = random. o algo más complicado con sprites).display. pero no tiene forma de mostrar eso en pantalla. ball): # Esta funcion dibuja la esfera en pantalla p = int(ball.init_pymunk() # Inicializamos Pymunk space = pymunk.add(body.tick(50) if __name__ == '__main__': # __name__ solo tiene el valor '__main__' cuando este script se c sys.set_caption("Pymunk test") clock = pygame. . y veremos que debemos emplear en Pymunk para hacer un pequeno juego de plataformas.representacion mas fiel a la realidad de nuestras simulaciones. Por ahora los dejo con lo que haremos en el siguiente articulo.
Report "Elchiguireliterario.com-Armando Un Juego Con Fisica en Python Pygame y Pymunk I"