sábado, 16 de junio de 2012

Easy pygame!

Una forma más facil de desarrollar juegos con pygame si eres primerizo. Solo requiere saber utilizar clases :

Como se utiliza?

Simplemete se escribe por ejemplo:
______________________________________________
import pygame # Obvio sino como funciona

"""
Aca tiene que ir una copia de la clase boton , de la clase sprite y la clase treadEventosPygame, que estan abajo. Si prefieren pueden hacer otro archivo llamado easy_pygame e importarlo aca
"""


def main(): #Creamos la funcion main() que ejecuta todo el programa


    pantalla = pygame.display.set_mode((400,400)) # creamos la pantalla de 400x400 px




    eventos = treadEventosPygame() #Creamos una clase que admisistra los eventos de mouse y teclado
    eventos.init() # lo inicializamos


    imagen_boton = pygame.image.load("ejemplo.png") # cargamos una imagen del mismo directorio 


    imagen_sprite = pygame.image.load("ejemplo2.png") # cargamos otra imagen ATENCION TIENEN QUE PONERLA EN EL MISMO DIRECTORIO QUE EL PROGRAMA CON EL NOMBRE QUE PONGAN (es obvio pero cualquiera puede confundirse).


   
    boton_1 = boton(imagen_boton, imagen_boton , 200 , 200) # Creamos el boton con la sintaxis   "boton( IMAGEN , IMAGEN DE NUEVO, x ,y)" 


    sprite_1 = sprite(imagen_sprite, 20 , 200) # Creamos el sprite con la sintaxis " sprite(IMAGEN , x , y)
    juego_avanza = True # Creamos la variabnle que permite hacer la actualizacion de la pantalla y el juego
 
    while juego_avanza == True: # Repeticion de la actualizacion del juego
        pantalla.fill((255,255,255)) # Llenamos la pantalla de color blanco
        eventos_actuales = eventos.devolver() #Obtenemos los eventos actuales
       
        mouse = eventos_actuales[0] # El item uno de la lista de eventos es el  estado del mouse
       
       
        presionar = boton_1.actualizar(mouse,pantalla) # Actualizamos y dibujamos en la pantalla el boton 1, si esta presionado presionar vale True y sino vale False


        if presionar == True:


             print "el boton esta presionado" # Imprimimos un mesaje si el boton esta presionado
             sprite_1.x += 20 # subimos 20 poscisiones x al sprite por ejemplo


        sprite_1.pintar(pantalla) # Pintamos el sprite sobre la pantalla
       
        pygame.display.update() #Actualizamos la pantalla del usuario


main() #Iniciamos el programa
#Aca solo faltaria lo que maneje el boton de exit, que sera explicado mas adelante.


LEYENDA:
Inicializacion del juego
Actualizacion del juego
Declaracion y llamada del juego
     
        




__________________________________________________________________
#Clase sprite (PARA INSERTAR IMAGENES Y MOVERLAS)
import pygame
pygame.init()

class sprite(pygame.sprite.Sprite):
    def __init__(self,imagen,x = 0,y = 0,rectangles = False):
     
        self.imagen = imagen
        self.originalImagen = self.imagen
     
        self.rect = self.imagen.get_rect()
        self.rects = [self.rect]
        self.t = self.imagen.get_size()
        self.h , self.w = self.t
        if rectangles != False:
            for x in range(len(rectangles)):
                self.rects.append(pygame.rect.Rect((rectangles[x][0],rectangles[x][1],rectangles[x][2],rectangles[x][3])))
        else:
            self.rects.append(pygame.rect.Rect((0,0,self.h , self.w)))
        self.x = x
        self.y = y
     
        for num in range(len(self.rects)):
            x = self.rects[num].left
            y = self.rects[num].top
            h = self.rects[num].height
            w = self.rects[num].width
            pygame.draw.lines(self.imagen,(200,100,200),True,((x,y),(x+w,y),(x+w,y+h),(x,y+h)),2)
     
     
     
    def cambiarXY(self,x,y):
        self.x = x
        self.y = y
    def moverIP(self,x,y):
        self.x+=x
        self.y+=y
    def aumentarTamanio(self,escala):
        actual1,actual2 = self.t
        self.imagen = pygame.transform.scale(self.imagen,(int(actual1*escala),int(actual2*escala)))
        self.t = self.imagen.get_size()
    def devolverPintadoEscala(self,escala,pantalla):
        actual1,actual2 = self.t
        escalaImage = pygame.transform.scale(self.imagen,(int(actual1*escala),int(actual2*escala)))                                    
        h,w = int(actual1*escala),int(actual2*escala)
        top = self.y -w/2
        left = self.x -h/2
        pantalla.blit(escalaImage,(left,top))
    def setearHW(self,h,w):
        self.imagen = pygame.transform.scale(self.imagen,(int(h),int(w)))
    def devolverRotada(self,angulo,pantalla):
     
        rotadaImage = pygame.transform.rotate(self.originalImagen,angulo)
        actual1,actual2 = rotadaImage.get_size()                    
        h,w = int(actual1),int(actual2)
        top = self.y -w/2
        left = self.x -h/2
        pantalla.blit(rotadaImage,(left,top))
    def pintar(self,pantalla):
        actual1,actual2 = self.t
        self.rect.top = self.y -actual2/2
        self.rect.left = self.x -actual1/2
        pantalla.blit(self.imagen,self.rect)
    def cambiarImagen(self,nuevaImagen):
        self.imagen = nuevaImagen
        self.rect = self.imagen.get_rect()
    def generarRotados(self):
     
        self.rotados = []
        for x in range(-90,90):
            imagen = pygame.transform.rotate(self.originalImagen,x)
            w,h = imagen.get_size()
         
            rectImagen =self.x- w/2,self.y -h/2
         
            self.rotados.append([imagen,rectImagen])
    def actualizarRotador(self,pantalla,rotado):
        pantalla.blit(self.rotados[rotado][0],self.rotados[rotado][1])
    def colicionar(self,objeto):
     
        for x in range(len(self.rects)):
            rectActual = pygame.rect.Rect((self.rects[x].left+self.rect.left,self.rects[x].top+self.rect.top,self.rects[x].width,self.rects[x].height))
            rectActualVecino = pygame.rect.Rect((objeto.rect.left,objeto.rect.top,objeto.rect.width,objeto.rect.height))
         
            if rectActual.colliderect(rectActualVecino) == True:
             
                return True
     
     
        return False
    def getPositionCenter(self):
     
        return self.x,self.y
______________________________________________________________
# Clase boton (PARA INSERTAR BOTONES FACILMENTE)



import pygame
pygame.init()



class boton(pygame.sprite.Sprite):
    def __init__(self,imagen,imagenP,x,y,text = "",color = (0,0,0),imagenPuso = False):
        self.text = text
        if self.text != "":
            font1 = pygame.font.Font(None,20)
            self.texto = font1.render(self.text,0,color)  
        self.imagen = imagen
        self.originalImage = imagen
        if imagenPuso == False:
            self.imagenP = pygame.transform.rotozoom(imagen,0,1.1)
        else:
            self.imagenP = imagenP
        self.rect = self.imagen.get_rect()
        self.y = y
        self.x = x
        self.rectP = self.imagenP.get_rect()
        self.width = int(self.imagenP.get_width())
        self.height =  int(self.imagenP.get_height())
        self.rect.top =  (self.imagenP.get_height()-self.imagen.get_height())/2
        self.rect.left = (self.imagenP.get_width()-self.imagen.get_width())/2
        self.superficie = pygame.Surface((self.width,self.height))
    def mostrar(self,pantalla,tocado):  
        pantalla.blit(self.superficie,(self.x,self.y))
        if tocado == True and self.text != "":
            pantalla.blit(self.texto,(self.x+10,self.y+self.width))
    def actualizar(self,mouse,pantalla,color = (0,0,100),usarCual =False,cual = False):
     
        mouseP = mouse[0]
        mouseX = mouse[1]
     
        mouseY = mouse[2]
     
     
        presionado = False
        tocado = False
        if mouseX > self.x +self.rect.left and mouseX < self.x+self.rect.left+self.width:
            if mouseY > self.y +self.rect.top and mouseY < self.y +self.rect.top+self.height:
                if mouseP == True:
                    presionado = True
                tocado = True
     
         
     
        if tocado == True:
            pantalla.blit(self.imagenP,((self.x+self.rectP.left),(self.y + self.rectP.top)))
        else:
            pantalla.blit(self.imagen,((self.x + self.rect.left),(self.y + self.rect.top)))
        return presionado
     
    def resetearImagen(self):
        self.imagen.blit(self.originalImage,(0,0))
______________________________________________________________

#Clase treadEventosPygame (tal como dice) que admistra los eventos de mouse y de teclado.
import pygame
pygame.init()
import threading
import thread
class eventosPygame:
    def __init__(self):
        self.exit = False
        self.mousePresionado = False
    def devolver(self):
        mouse =[0,0,0,0]
        mouse[0] = False
        key = False
        Down = None
        scroll = 0
        if self.exit == True:
            return ["exit",[0,0,[]]]
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
             
                self.exit = True
                return ["exit",[0,0,[]]]
            if event.type == pygame.MOUSEBUTTONDOWN:
                self.mousePresionado = True
                if event.button == 4:
                    scroll = 1
                elif event.button == 5:
                    scroll = -1
            if event.type == pygame.MOUSEBUTTONUP:
                self.mousePresionado = False
            if event.type == pygame.KEYDOWN:
                key = event.key
                Down = True
             
             
            if event.type == pygame.KEYUP:
                key = event.key
                Down = False
     
        mouse[0] = self.mousePresionado
     
        mouse[1], mouse[2] = pygame.mouse.get_pos()
        mouse[3] = scroll
        keyss = pygame.key.get_pressed()
        keys = []
        for x in range(len(keyss)):
            if keyss[x] == 1:
                keys.append(x)
     
        return [mouse,[key,Down,keys]]
class treadEventosPygame(threading.Thread):
    def init(self):
        self.eventos = [[0,0,0],[None,False,[]]]
        self.start()
    def run(self):
     
        reloj = pygame.time.Clock()
        eventos = eventosPygame()
        self.cont = True
        while self.cont == True:
            self.eventos = eventos.devolver()
            if self.eventos[0] == "exit":
                self.cont = False
         
            reloj.tick(20)
        sys.exit()
    def devolver(self):
     
        return self.eventos
     
        return [[0,0,0],[None,False,[]]]
    def finalizar(self):
        self.cont = False


No hay comentarios:

Publicar un comentario