You are on page 1of 4

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 Chigire Literario siempre he recomendado a aquellos que estn haciendo un juego por primera vez en su vida que desarrollen un juego en 2D. La reaccin 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 percepcin le debemos sumar la visin del juego 2D como el juego vieja escuela (pensemos en MegaMan) donde la sensacin de juego es como la de un arcade, en contraste con los juegos en 3D ricos en interacciones fsicas que se asemejan a la realidad. La buena noticia es que esto no se limita solamente al 3D. Se han hecho excelentes libreras para tener simulaciones fsicas para el caso 2D que se sientan reales. Una de estas libreras es la ya famosa Box2D, por Eric Catto, utilizada principalmente en el juego Angry Brids. Otra librera muy completa, que es la que researemos en este post, es Chipmunk. Chipmunk es una librera de fsica de cuerpos rgidos en 2D escrita en C. Para algunos universitarios la mencin de fsica de cuerpos rgidos 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 librera y cmo se deben utilizar para nuestros fines. Al estar escrita la librera en C, significa que hay una gran diversidad de bindings a otros lenguajes de programacin, por lo que podemos usar esta librera escribiendo cdigo 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 fcil de instalar como PyGame, por lo que en pocos instantes vas a tener el poder de crear juegos con interacciones fsicas realsticas y sin tener que aprender un montn 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 fenmenos ocurren dentro de un espacio, que no es ms 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.

Body (Cuerpo) Todos los cuerpos dentro de un espacio tienen propiedades fsicas. En el caso de 2 dimensiones, tenemos la masa y tenemos la inercia. La masa es la cantidad de materia en el cuerpo, y para Pymunk indica qu tanta fuerza hay que aplicar en centro de gravedad para moverlo. Si han visto alguna materia sobre fsica de cuerpos unidimensionales, reconocern que esto es lo mismo. Por otro lado, la inercia representa la cantidad de fuerza que hay que aplicar en el cuerpo para que ste rote sobre su centro de gravedad. Un cuerpo con muchsima masa ser casi inamovible por cualquier fuerza, y un cuerpo con muchsima inercia ser muy difcil de hacer girar. Son dos propiedades distintas: un cuerpo puede tener una masa tan grande que no se pueda mover y an 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). No hemos hablado de la forma que puede tener el cuerpo. Los cuerpos en Pymunk no tienen esta informacin, son entes que no pueden existir en el espacio si no vienen acompaados de una forma. Shape (Forma) La forma es la figura que adopta el cuerpo. Esta figura puede ser un crculo, un rectngulo o un polgono convexo. En todos los casos la forma tiene un offset que es el centro de gravedad del cuerpo. Como la inercia de un cuerpo suele venir dada por la figura, Pymunk tiene mtodos para hacer un clculo aproximado de esa inercia. Joint (Junta) Los joints proveen restricciones al movimiento de los cuerpos. Un caso que ya mencionamos es el de la barra fija a la pared mediante un clavo. Otro caso puede ser limitar el ngulo de movimiento de esa barra. Otro caso puede ser conectar dos engranajes. Existe una diversidad de juntas para mltiples necesidades. Cmo nos iniciamos? Para comenzar, asumiendo que tenemos instalado Python y Pygame, hay que instalar Pymunk. En Windows es tan sencillo como descargar el instalador de la pgina de descargas, y en Linux se descarga la fuente y se instala con el procedimiento de ejecutar python setup.py install en el directorio descomprimido del proyecto. Los scripts que veremos a continuacin estn basados en el tutorial SlideAndPinJointsExample de la pgina de Pymunk. Una vez hecho eso, podemos escribir un pequeo script que nos haga probar que pymunk se puede importar bien.

import sys import pygame from pygame.locals import * from pygame.color import * import pymunk # Importamos Pymunk def main(): pygame.init() screen = pygame.display.set_mode((600, 600)) pygame.display.set_caption("Pymunk test") clock = pygame.time.Clock() running = True pymunk.init_pymunk() # Inicializamos Pymunk space = pymunk.Space() # Creamos el Space space.gravity = (0.0, -900.0) # Colocamos gravedad: una fuerza constante en el tiempo while running: for event in pygame.event.get(): if event.type == QUIT: running = False elif event.type == KEYDOWN and event.key == K_ESCAPE: running = False screen.fill(THECOLORS["white"]) space.step(1/50.0) # Hacemos que la simulacin corra 1/50.0 de cada segundo pygame.display.flip() clock.tick(50) # Como este loop corre 50 veces por segundo, estimamos que este cdigo se com if __name__ == '__main__': # __name__ solo tiene el valor '__main__' cuando este script se c sys.exit(main()) Qu relacin tiene con PyGame?

Pymunk ofrece una simulacin bastante precisa (para nuestros fines) del movimiento de cuerpos rgidos, pero no tiene forma de mostrar eso en pantalla. PyGame en este caso sera el encargado de: 1) hacer la representacin en pantalla de la simulacin (algo tan sencillo como lneas y puntos, o algo ms complicado con sprites), 2) realizar alguna tarea relacionada con el producto de las colisiones entre elementos de Pymunk, como producir sonido o lanzar algn evento, 3) establecer el timer para ejecutar la simulacin paso por paso en el tiempo (con el objeto Clock). Expandiremos el ejemplo anterior colocando un generador de esferas en el loop y dibujndolo con las funciones de Pygame:

import sys import pygame from pygame.locals import * from pygame.color import * import pymunk def add_ball(space): # Esta funcion agrega una esfera mass = 1 radius = 14 inertia = pymunk.moment_for_circle(mass, 0, radius) # Por lo general la inercia se saca por body = pymunk.Body(mass, inertia) # Creamos el cuerpo x = random.randint(120,380) body.position = x, 550 # Le asignamos una posicion al azar en el eje horizontal shape = pymunk.Circle(body, radius) # Al cuerpo le asignamos una forma space.add(body, shape) # Tnato el cuerpo como su forma se agregan al espacio return shape def draw_ball(screen, ball): # Esta funcion dibuja la esfera en pantalla p = int(ball.body.position.x), 600-int(ball.body.position.y) pygame.draw.circle(screen, THECOLORS["blue"], p, int(ball.radius), 2) def main(): pygame.init() screen = pygame.display.set_mode((600, 600)) pygame.display.set_caption("Pymunk test") clock = pygame.time.Clock() running = True pymunk.init_pymunk() # Inicializamos Pymunk space = pymunk.Space() # Creamos el Space space.gravity = (0.0, -900.0) # Colocamos gravedad: una fuerza constante en el tiempo balls = [] ticks_to_next_ball = 10 while running: for event in pygame.event.get(): if event.type == QUIT: running = False elif event.type == KEYDOWN and event.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.append(ball_shape) screen.fill(THECOLORS["white"]) for ball in balls: draw_ball(screen, ball) space.step(1/50.0) pygame.display.flip() clock.tick(50) if __name__ == '__main__': # __name__ solo tiene el valor '__main__' cuando este script se c sys.exit(main()) Y en el proximo capitulo... Hasta aca llegamos con el articulo de hoy sobre Pymunk. Los scripts que aparecen en este articulo se pueden descargar aqui. En el siguiente articulo veremos como utilizar los sprites de Pygame para tener una

representacion mas fiel a la realidad de nuestras simulaciones, y veremos que debemos emplear en Pymunk para hacer un pequeno juego de plataformas. Por ahora los dejo con lo que haremos en el siguiente articulo.

You might also like