miércoles, 14 de diciembre de 2011

Animación hecha con Pygame

Esta vez les presento un segundo ejemplo en python usando la librería gráfica Pygame, esta mas organizado que los anteriores y al final podrán encontrar los links para descargarlo completo.
Este ejemplo a diferencia de los anteriores usa sprites animados, dando la sensación de que el personaje camina; cabe aclarar que es un ejemplo muy sencillo ya que el usuario no interactúa es una simple animación, sin embargo es muy fácil hacer que el personaje se mueva con el teclado si se implementa las instrucciones del teclado del ejemplo anterior.

Se divide en dos archivos: sujetos.py y juego.py


sujetos.py

import pygame

class sujeto(pygame.sprite.Sprite):
    """De esta clase heredan los objetos vivientes"""    
    def __init__(self, imagenes):        
        self.imagenes = imagenes        
        self.frame = 0   
        self.indicador = 30     
        self.rect = self.imagenes[self.frame].get_rect()
        self.rect.top = 300
        self.rect.left = 40        
    def move(self, vx,vy):
        self.rect.move_ip(vx,vy)
    def update(self, superficie):
        superficie.blit(self.imagenes[self.frame],self.rect)   
    def nextFrame(self):  
        self.frame = self.indicador % len(self.imagenes) #controla los indices de las imagenes
        self.indicador+=1   #sigue a la imagen siguiente
    def setNewSprites(self,imagenes):
        self.imagenes = imagenes    
        
class Player(sujeto):
    """Clase del heroe"""
    def __init__(self, imagenes):        
        sujeto.__init__(self,imagenes)        
    def getLife():
        return self.life

juego.py

import pygame
import sujetos
import os

# Constantes
ANCHO = 640
ALTO = 480

# Inicializaciones y variables globales
pygame.init()
screen = pygame.display.set_mode((ANCHO,ALTO))
pygame.display.set_caption("SponjeBob Attack")
reloj = pygame.time.Clock()

# Carga las imagenes
def load_img(nombre, directorio):
    ruta = os.path.join(directorio,nombre)
    try:
        image = pygame.image.load(ruta)
    except:
        print "Error! no se puede cargar la imagen"
    return image.convert_alpha()       

imagenesPlayerDer = [load_img("walkr1.png","Res"),load_img("walkr2.png","Res"),
                     load_img("walkr3.png","Res"),load_img("walkr4.png","Res"),
                     load_img("walkr5.png","Res"),load_img("walkr6.png","Res"),]    
imagenesPlayerIzq = [load_img("walkl1.png","Res"),load_img("walkl2.png","Res"),
                     load_img("walkl3.png","Res"),load_img("walkl4.png","Res"),
                     load_img("walkl5.png","Res"),load_img("walkl6.png","Res"),]
imagenFondo = load_img("fondo.png","Res")
                     
# Pinta las imagenes en la pantalla                     
def paint(player):
    screen.blit(imagenFondo,[0,0])
    player.update(screen)
    pygame.display.update()
    player.nextFrame()

def main():   
        
    spritesRight = True
                            
    player = sujetos.Player(imagenesPlayerDer)    
    exit = False   
    vx = 15
    
    while exit != True:     # Bucle principal
        paint(player)        
        player.move(vx,0)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:                
                exit = True                
        # control de los limites   
        if player.rect.left >= ANCHO or player.rect.left <= 0:
            vx=-vx
            if spritesRight == True:  #si mira hacia la derecha
                player.setNewSprites(imagenesPlayerIzq)
                spritesRight = False
            else: #si mira hacia la izquierda
                player.setNewSprites(imagenesPlayerDer)
                spritesRight = True     
        reloj.tick(12)
    pygame.quit()

# INICIO
if __name__ == '__main__':
    main()



Pueden descargar el código completo con las imagenes aquí o aquí. Esos son módulos base para el juego que publicare próximamente, hasta entonces.

1 comentario:

  1. y como le hago para hacer lo mismo pero ponerlo de fondo ? es q quiero hacer un "gif(varias de mis imagenes)" de fondo

    ResponderEliminar