Pygame 1, Primeros pasos.

Hola a tod@s, bueno, ya os dí unos pequeños detalles básicos sobre la estructura de un juego en pygame, pero hoy, vamos a tomar esto un poco mas en serio, os voy a enseñar a hacer las primeras cosas básicas, crear una ventana y un fondo, algo simple pero bastante bien para empezar.


#---------importamos los modulos----------------
import pygame
from pygame.locals import *

 
 #--------definimos las contantes--------------------

altura=640
anchura=480

#-----definimos aquí todas las clases y funciones a utilizar----------

#---funcion principal del juego

def main():
          #iniciamos pygame
          pygame.init()
          #creamos una ventana
          ventana=pygame.display.set_mode((altura, anchura))
          #definimos un titulo para la ventana
          pygame.display.set_caption("Probando pygame....")

if __name__== "__main__":
         main()



Bueno, probad este código y veréis como se crea una ventana pero automáticamente se cierra, eso es por que no hemos definido un bucle principal, ya que main es una función normal y corriente que al llegar al final de esta, no vuelve al principio, para definir un bucle continuo dentro de "main" escribimos un "while True", esta contrucción, no es una buena práctica en la programación, ya que la finalidad de un "while" no es crear un bucle infinito como el que vamos a hacer ahora, pero, no nos quedan mas alternativas:

#---------importamos los módulos----------------
import pygame
from pygame.locals import *
import sys

 
 #--------definimos las contantes--------------------

altura=640
anchura=480

#-----definimos aquí todas las clases y funciones a utilizar----------

#---funcion principal del juego

def main():
    
          pygame.init()
          ventana=pygame.display.set_mode((altura, anchura))
          pygame.display.set_caption("Probando pygame....")

         #aquí el "loop" del juego, es decir, el bucle principal
          while True:
                  #posibles entradas del teclado
                  for eventos in pygame.event.get():
                          if eventos.type==pygame.QUIT:
                                  sys.exit()
                
                 

if __name__== "__main__":
         main()

De esta forma, debéis de ver la ventana y no se cerrará como anteriormente, para cerrarla, simplemente cerrarla como cualquier otra ventana, no os asustéis por el código que hay dentro del loop, es mas sencillo de lo que parece.

Todos los eventos que recibe pygame incluido las pulsaciones del teclado, se registran en una lista gestionada por este módulo llamada "event", la cual tiene unos métodos para hacer cositas con esta, como "get", este método obtiene los elementos de esta lista, al ser un objeto iterable podemos usarla en un for para iterar con sus elementos, es decir, comparamos todos los elementos de la lista de event con "pygame.QUIT", si coinciden, es que le as dado a cerrar ventana, y ejecuta el código dentro del condicional, que es "sys.exit()", del módulo sys, que simplemente le ordena al sistema operativo que cierre la ventana.

A primera vista parece complicado, pero es muy sencillo.

Bueno, ahora que ya tenemos una ventana....¿Qué vamos a hacer con ella?, pues de momento, vamos a ponerle una imagen de fondo.

Este punto es muy importante, lo siguiente se aplica tanto a un fondo que se vaya a usar, como para cualquier otro objeto del juego, el procedimiento es el mismo, básicamente son tres pasos:

1.- Cargar la imagen
2.- Dibujarla en pantalla
3.- Refrescar la pantalla para apreciar los cambios. 

En pygame, para dibujar cualquier imagen, se usa un sistema de coordenadas idéntico a un plano con dos ejes, salvo que el origen de estos ejes(coordenada: 0,0) empiezan desde la esquina superior izquierda de la ventana.

Primer paso:

Para cargar la imagen, se usa el método load, del método image, es decir:

fondo=pygame.image.load("imagen.jpg").convert()

Podéis hacer la prueba con una foto que encontré en otro blog:


Os descargáis la foto, la ponéis en la misma carpeta que el archivo .py, y la podéis usar para hacer pruebas.

Segundo paso:

Para dibujarla en pantalla se usa el método blit de la ventana que hemos creado al principio de este tutorial, pasándole como argumentos, la imagen que hemos cargado y las coordenadas donde se dibuja la imagen respectivamente, en este caso, como es el fondo, será en la posición (0, 0):

ventana.blit(fondo, (0, 0))

Tercer paso:

Refrescar pantalla:

Aunque carguemos una imagen y le digamos la posición donde queramos dibujarla en pantalla, no la veremos a no ser que actualizemos la ventana, simplemente usamos el método "filp" de "display":

pygame.display.flip()

Y ya esta, ahora si juntamos todo el código se nos quedaría algo así:

#---------importamos los módulos----------------
import pygame, sys
from pygame.locals import *


 
 #--------definimos las contantes--------------------

altura=640
anchura=480

#-----definimos aquí todas las clases y funciones a utilizar----------

#---función principal del juego

def main():
    
          pygame.init()
          ventana=pygame.display.set_mode((altura, anchura))
          pygame.display.set_caption("Probando pygame....")
          
          #cargamos la imagen
          fondo=pygame.image.load("imagen.jpg").convert()
          #indicamos la posición donde queremos dibujarla
          ventana.blit(fondo, (0, 0))
           #actualizamos la ventana
           pygame.display.flip()
           
          

         #aquí el "loop" del juego, es decir, el bucle principal
          while True:
                  #posibles entradas del teclado
                  for eventos in pygame.event.get():
                          if eventos.type==pygame.QUIT:
                                  sys.exit()
                
                 

if __name__== "__main__":
         main()


Y ya esta, ¿A que no era para tanto :) ?, para cargar cualquier tipo de objeto se hace exactamente igual, tan sólo tenéis que tener en cuenta las coordenadas para ir jugando con la posición, en próximos tutoriales veremos como mover objetos, colisiones... esto es la base, y es importante que os quede claro.

Pd: No le llaméis al archivo ":py" "pygame.py", ya que si lo hacéis no podréis importar pyagme y os dará error, os lo digo por experiencia propia.

Llegados a este punto me despido de todos vosotr@s y espero que os haya gustado el tutorial de hoy, aprovecho también este espacio para comentaros que he eliminado la publicidad de esta página, tan sólo os pido que si estáis agradecidos con el blog y sois de España, cuando alguna vez os decidáis por crear un negocio y necesitéis un diseñador web para crear la página de su empresa o la de un amigo, conocido... me tengáis en cuenta, por que, aparte de ser blogger y programador aficcionado, también soy diseñador web.

Así que ya sabéis, si necesitáis una página web para tu negocio o el de algún conocido, enten en: Desarrollo Web Domínguez

Un abrazo a tod@s.


6 comentarios:

Dr Coloso dijo...

Lo estoy leyendo, pero cuando hago.
pygame.display.set_mode(alto,ancho)
O
pygame.display.set_mode(640,480)
Me da un error:
TypeError: must be 2-item sequence, not int
En cambio si hago asi,
alto_ancho=[640,480]
pygame.display.set_mode(alto_ancho)
Ahi arranca

Francisco Dominguez Lerma dijo...

Si, perdona, es error mio, ya esta solucionado, por que resulta que no se le deben pasar los argumentos tal cual lo he hecho, si no pasados como una tupla, es decir:

pygame.display.set_mode((alto,ancho))
O
pygame.display.set_mode((640,480))

Y ya esta, perdón por el fallo y gracias por comentar.

Un saludo.

Dr Coloso dijo...

en la parte que dice ventana.flip() no agarra por que ventana es nada mas que para cambiar el tamaño
deberia ser asi

pygame.display.flip()

Despues la parte que dice,

if eventos.type=="pygame.QUIT":
sys.exit()

deberia ser asi,

if eventos.type==pygame.QUIT:
os.sys.exit()

Asi por lo menos cierra en windows.
Saludos y muy bueno el tutorial

Francisco Dominguez Lerma dijo...

En lo de actualizar la superficie llevas razón, y en lo de "pygame.QUIT" también, pero, "sys.exit()" funciona perfectamente en linux, por lo cual esto último no lo voy a modificar.

Gracias por tu respuesta, y perdonad los errores, es que este post lo tuve que escribir estando en clase, y claro, no pude dedicarle mas de dos horas.

Un saludo.

Anónimo dijo...

Estuve viendo tus tutoriales, me son de mucha utilidad.
Me interesa mucho pygame espero ver nuevas entregas pronto. Muchas gracias!.
Franco

Francisco Dominguez Lerma dijo...

Gracias Franco, a ver si mañana tengo un rato libre y escribo un artículo, hoy es que estoy muy liado y no voy a poder, pero mañana lo mas seguro es que si pueda.

Un abrazo y bienvenido al blog.