viernes, 31 de mayo de 2013

Tutorial Pygame parte 2

En esta ocasión aprenderemos un poco de gravedad en un videojuego,o mejor dicho mas especifico  simular la gravedad en pygame,primero que nada vamos a simular el rebote de una pelota,como ya es bien conocido en pygame,luego usaremos esas mismas teorías para emular la gravedad.

Parte 1

Primero que nada usaremos esta funcion de pygame,(move) mas en especifico rect.move:

mover rectángulos

En pygame usamos mucho los rectángulos,en el tutorial pasado y en este solo hemos usado y usaremos rectángulos,que son imágenes con alfa y por eso no se ve el rectángulo,existen muchas funciones de los rectángulos que en teoría es lo que crea todo el juego,manipulación de rectángulos(imágenes):

Mas informancion

Primero que nada debemos tener una plantilla para realizar la programación de nuestro juego(que hasta ahora son solo ejercicios de entendimiento),la cual puede ser así:

Enlace

Bien,esa plantilla la pueden usar,es la mas común pero en este caso usaremos la que usamos en el tutorial pasado:

Primero que nada vamos a usar esta función de pygame move(),a la cual se le pasan dos parámetros:

rect.move(x,y) # Horizontal vertical

Para ello crearemos una lista para pasar el valor de x,y:

xy = [0,5]:

0 es el movimiento en horizontal y 5 en vertical,ya que solo quiero emular la caída de un objeto.

También definimos una lista con el valor de nuestro fondo en RGB:

Hasta ahora va así:

 #!/usr/bin/env python  
 #-*- coding:utf-8 -*-  
 size = alto,ancho = 400,400  
 xy = [0,5]  
 color = [119,255,221]  

Vamos a usar la función de cargar imágenes abajo de eso:

 def cargar_imagen(nombre,alfa=False):   
   imagen = pygame.image.load(nombre)   
   if alfa == True:   
     imagen = imagen.convert_alpha()   
   else:   
     imagen = imagen.convert()   
   return imagen   

Y vamos a crear una clase para poder definir la pelota:

 class Pelota(pygame.sprite.Sprite):  
   def __init__(self):  
     pygame.sprite.Sprite.__init__(self)  
     self.imagen = cargar_imagen("objeto.png",alfa=True)  
     self.rect = self.imagen.get_rect()  
     self.rect.centerx = alto / 2  
     self.rect.centery = ancho / 2  

Eso nos crea una clase para poder crear pelotas,una en esta ocasión que estará en la mitad de la pantalla(como vimos en la parte uno de los tutoriales):

Abajo de la clase iniciamos pygame,la pantalla,instanciamos la pelota y cargamos la imagen(lo vimos en la primera parte del tutorial):

 screen = pygame.display.set_mode(size)  
 pygame.display.set_caption("Ejemplo 2")  
 pelota = Pelota()  
 imagen_pelota = pelota.imagen  
 jugando = True  

Ademas de eso,abajo vamos a añadir:

clock = pygame.time.Clock()

La función tiem.Clock de pygame manipula los framerate(FPS[imágenes en movimiento]) del juego,ya que al mover las imágenes se puede ver un poco trabado,usando FPS de 50 o 60 se vera muy bien.

Ahora añadimos lo que falta:


 while jugando:  
   clock.tick(60)  
   for event in pygame.event.get():  
     if event.type == pygame.QUIT:  
       jugando = False  
   pelota.rect = pelota.rect.move(xy)  
   if pelota.rect.top < 0 or pelota.rect.bottom > ancho:  
     xy[1] = -xy[1]  
   screen.fill(color)  
   screen.blit(imagen_pelota, pelota.rect)  
   pygame.display.flip()  
 else:  
   sys.exit()  

Con la funcion tick(60) estamos diciendo que vamos a usar 60 FPS.

Con pelota.rect.move(xy) estamos diciendo que mueva la pelota en xy que es 0,5 en este caso solo funciona el movimiento y(vertical) al cual sumara 5 y creara un efecto de atraccion a lo que seria el suelo(hacia abajo):

Con :

if pelota.rect.top < 0 or pelota.rect.bottom > ancho:  
Estamos diciendo que si la localización de la pelota,toca la parte superior(top) o toca la parte inferior(bottom) le reste su mismo valor al item numero 1 de la lista que mueve la pelota(5) y así crear un efecto de rebote al tocar alguna de los dos partes de la pantalla:

Así queda el código final:

Enlace


Si no tienen una pelota pueden usar esta:


Solo coloquen-la donde esta el script que acabamos de crear.




Ahora vamos a hacerlo mas interesante,vamos a eliminar el código que hace rebotar.

Ahora vamos a crear una clase para crear rectangulos,los cuales vamos a tomar de una imagen,esta:



Descarguen y guardenla donde esta el script:

Ahora creamos la clase que va ha hacer que ese rectangulo entre en el juego:

 class Rect(pygame.sprite.Sprite):   
   def __init__(self,x,y):  
     self.x = x  
     self.y = y  
     pygame.sprite.Sprite.__init__(self)   
     self.imagen = cargar_imagen("rectangulo.png",alfa=True)   
     self.rect = self.imagen.get_rect()  
     self.rect.centerx = self.x   
     self.rect.centery = self.y  

Le pasamos dos parametros,(x,y) para poder posicionarlos en la pantalla,se los pasaremos al constructor(__init__) para poder crear varios rectangulos de esta clase:

Los instanciamos y cargamos la imagen de dos rectángulos:

 rect1 = Rect(75,90)  
 rect2 = Rect(150,140)  
 imagen_rect1 = rect1.imagen  
 imagen_rect2 = rect2.imagen  

Nuestro bucle while va a quedar así:

 while jugando:  
   clock.tick(50)  
   for eventos in pygame.event.get():  
     if eventos.type == pygame.QUIT:  
       jugando = False  
     elif eventos.type == pygame.KEYDOWN:  
       if eventos.key == pygame.K_q or eventos.key == pygame.K_ESCAPE:   
         jugando = False  
       elif eventos.key == pygame.K_LEFT:   
         pelota.rect.centerx -= 5   
       elif eventos.key == pygame.K_RIGHT:   
         pelota.rect.centerx += 5  
   pelota.rect = pelota.rect.move(xy)  
   pelota.update()  
   screen.fill(color)  
   screen.blit(imagen_pelota, pelota.rect)  
   screen.blit(imagen_rect1, rect1.rect)  
   screen.blit(imagen_rect2, rect2.rect)  
   pygame.display.flip()  
 else:  
   sys.exit()  

Si vieron el tutorial pasado observaran que con ese código podemos mover la pelota de izquierda a derecha y que podemos salir del juego pulsando esc o q,otra cosas que cabe mencionar es que donde estaba la estructura que hacia rebotar la pelota esta vez esta un metodo de la pelota(update()) el cual aun no creamos,aunque la funcion que mueve la pelota aun se encuentra,esto es para que la pelota caiga al suelo creando un efecto de gravedad basico,mas abajo se muestra que añadimos los dos rectangulos al juego.

Para poder ejecutar el codigo vamos a añadir el metodo update a la clase Pelota:


   def update(self):  
     if self.rect.colliderect(rect1.rect):  
       self.rect.centery = rect1.rect.centery - 15  
     if self.rect.colliderect(rect2.rect):  
       self.rect.centery = rect2.rect.centery - 15  
     if self.rect.centerx <= 10:  
       self.rect.centerx = 10  
     if self.rect.centery >= alto - 10:  
       self.rect.centery = alto - 10  
     if self.rect.centerx >= ancho - 10:  
       self.rect.centerx = ancho - 10  

Lo explico:

Este update son solo estructuras selectivas que verifican si la pelota choco con un objeto de la pantalla,en este caso puede ser el rectángulo 1 o 2 y también que no se salga de la pantalla,ya que en la entrada pasada si se salia la pelota que creamos para ver la ubicación de un objeto:

Todo esto se logra con la función colliderect,que verifica una colisión de dos objetos,el cual es:

objeto.rect.colliderect(x,y): # x,y posicion del otro objeto
Las variables que dicen:

self.rect.centerx = numero
Estamos diciendo que le asignamos un nuevo valor a la posicion (x,y) vertical(centery) o horizontal(centerx).

El código entero queda así,ya que no explique cosas que teniamos que añadir que explique en el tutorial pasado:

Enlace
Eso es todo,también les dejo un código mas avanzado en el cual agrego un elevador que sube la pelota de nuevo(usando lo que se aprendió en esta entrada),estúdienlo,compréndalo,modifiquen lo,mejorenlo:

Enlace
Eso es todo :D

No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.