Professional Documents
Culture Documents
com
http://www.elchiguireliterario.com/2011/07/12/armando-un-juego-con-fisica-en-pythonpygame-y-pymunk-i/
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.