viernes, 2 de enero de 2009

pacman 0.005 - Construyendo un laberinto

código pacman

En esta nueva entrega de desarrollo de un juego clásico de pacman usando Python y Pygame, vamos añadir paredes para poder construir un laberinto en el que pacman huye de los fantasmas mientras se va comiendo todo lo que encuentra.

Añadimos una nueva clase denominada "Pared" que heredera de la clase "Sprite". Lo particular de esta clase es que no cargaremos una imagen sino que se dibujará un rectángulo. Para hacer esto crearemos una superficie de dibujo con las dimensiones especificadas a través de una lista o tupla que indica ancho y alto, "pygame.Surface(dimension)", y a continuación la rellenaremos del color deseado, "image.fill(color)".

class Pared ( pygame.sprite.Sprite ):
def __init__(self, color, pos_inicial, dimension):
pygame.sprite.Sprite.__init__(self)

self.image = pygame.Surface(dimension)
self.image.fill(color)

self.rect = self.image.get_rect()
self.rect.topleft = pos_inicial
self.infranqueable = True

def update(self):
pygame.sprite.Sprite.update(self)

Además, queremos que las paredes no puedan ser atravesadas por pacman ni por los fantasmas. Para hacer esto, modificaremos la función "update" de la clase "MiSprite", comprobándose si el sprite choca contra otro sprite que presenta la propiedad "infranqueable". Observa que al final de la función "__init__" de la clase "Pared" hemos inicializado la propiedad "infranqueable" a True.

class MiSprite ( pygame.sprite.Sprite ):
...
def update (self):
#la funcion "copy" crea una copia del rectangulo
copia_rect = copy.copy(self.rect)

self.rect.move_ip ( self.velocidad[0], self.velocidad[1])

colisiones = pygame.sprite.spritecollide(self,
sprites,
False)
for colision in colisiones:
if colision != self:
if hasattr ( colision, "infranqueable" ):
if colision.infranqueable:
self.rect = copia_rect
return
...

Como lógica para manejar el choque con los objetos "infranqueables" hemos guardado la posición del sprite, movido el sprite y a continuación comprobado si choca contra un objeto. Si es así, volvemos el sprite a la posición original antes del choque.

Por último, creamos dos paredes en nuestro juego para probar nuestra nueva versión.

sprite = Pared ( [150,150,150], [72,72], [100,10] )
sprites.add ( sprite )

sprite = Pared ( [150,150,150], [172,172], [10,100] )
sprites.add ( sprite )
En la próxima entrega añadiremos un marcador a nuestro juego en donde se visualice los puntos y las vidas que les queda a nuestro pacman.

No hay comentarios: