Nociones fundamentales de pygame

Posted on mayo 12, 2007. Filed under: PyGame, Python |

Cuando empecé con pygame lo que me mas me costó era entender sobre que era un superficie (surface) un sprite, como mostrar las imagenes, cual era la mejor forma, que es el doblebuffer de la pantalla, etc. Por eso me propongo con este post aclarar estos términos que me costaron entender. No pretendo que sea una guia para comenzar con la programación de video-juegos, solo aclarar algunas ideas un tanto complicadas.

Superficie y explicación de la función blit

En pygame toda imagen se representa mediante una superficie y esto permite combinarlas.
Por ejemplo tenemos 2 superficies una llamada screen_sup y otra llamada fondo_sup, la superficie screen_sup abarca toda la ventana (por ahora esta vacia, no tiene imagen dentro), y la superficie fondo_sup es una imagen jpg.

screen_sup = pygame.display.get_surface() 
fondo_sup = pygame.image.load(“archivo.jpg”)

Usando la funcion blit copiamos y pegamos la superficie fondo_sup en la posicion x,y de la superficie screen_sup

screen_sup.blit(fondo_sup, (x,y)) # funcionamiento superficie_destino.blit(superficie_origen,(coordenadas))

Las superficies tienen diferentes funciones, algunas muy utiles, por ejemplo fill que pinta la superficie de un color, o get_width y get_height que devuelven el ancho y el alto respectivamente de la superficie. Uso:

alto=fondo_sup.get_height()
ancho=fondo_sup.get_width()
rectangulo=fondo_sup.get_rect() #devuelve las coordenadas de un rectángulo que cubre la superficie

Para ver un listado de todos los posibles metodos que tienen las superficies pueden visitar este enlace.

Doblebuffer y explicación de la función flip

Cuando mostramos una imagen y la queremos mover de lugar, tenemos que borrarla, moverla un poco, mostrarla, moverla un poco mas, borrarla, etc hasta llegar al destino, pero a veces este proceso es muy rápido y el monitor no llega a dibujar por completo cada imagen del desplazamiento y parece como si la imagen estuviese entrecortada, para evitar tener que estar dibujando, borrando dibujando usaremos el doblebuffer.

El doblebuffer son 2 areas de memoria ram, donde se guardan las imagenes, una de las areas siempre estará activa, es decir sera visible para el usuario y la otra estará oculta. Veamos un ejemplo:

Imagen de la pelota en la posicion 1
while posicion_pelota<=10
    mover_pelota_una_posicion()
    pygame.display.flip()

Cuando movemos nuestra pelota no la veremos hasta que no hayamos ejecutado pygame.display.flip(), en el primer paso del programa la imagen que se ve es la de la posicion 1 y la imagen que esta oculta es la de la posicion 2, pero al escribir pygame.display.flip() intercambiamos las pantallas y mostraremos la posicion 2 y ocultaremos la 1. Cada cambio de posicion se hace de forma oculta y hasta que no hacemos flip no veremos el efecto de movimiento.

Por se explica que en el ejemplo de screen_sup y fondo_sup si no escribimos pygame.display.flip() al final, no veremos el fondo.

El usar display.flip() hace que se cambie toda pantalla completa y esto puede ser una desventaja, pero hay técnicas que permiten intercambiar solo las regiones que hayan sido modificadas esta ultima técnica a veces da mejores resultados en cuanto a velocidad en los movimientos.

Sprite

habíamos dicho que una superficie es cualquier imagen que usamos en pygame, ya que para cargar cualquier imagen usamos pygame.load.image(archivo) y esta función solo devuelve una superficie.
En el caso de los sprites es mas general, la clase de los sprites se usa para diferentes tipos de objetos, por ejemplo un objeto sprite puede contener a una superficie y métodos o funciones.

A continuación creamos una clase sprite llamada Auto, esta clase tiene una imagen (superficie) correspondiente y tiene 3 métodos: encender, frenar y update.

class Auto(pygame.sprite.Sprite)
   
    def __init__(self,foto):
       pygame.sprite.Sprite.__init_(self)
       self.velocidad=0
       self.imagen = pygame.load.image(foto)
   
    def frenar(self):
       self.velocidad=0

    def encender(self, angulo):
       self.velocidad=2
      
    def update(self):
       self.rect.move_ip(self.velocidad,0)

Para instanciar las clases hacemos:

fiat= Auto(“fiat.jpg”)
ferrari = Auto (“f1.jpg”)

Lo que hicimos con esto es crear 2 objetos auto, cada uno con diferentes imagenes. No voy a ampliar esto por que merece que un parrafo aparte. Quiero comentar lo que son los grupos.

Una gran utilidad cuando tenemos muchos autos, naves, enemigos, etc es crear grupos, por ejemplo el grupo_de_enemigos

grupo_enemigos = pygame.sprite.Group()   #creamos el grupo de los enemigos
grupo_enemigos.add(Enemigo(imagen_enemigo1)) #agregamos un enemigo
grupo_enemigos.add(Enemigo(imagen_enemigo2)) #agregamos otro enemigo

Con esto creamos un grupo y le agregamos 2 enemigos, la ventaja principal de los grupos es poder “enviarle ordenes” a todos los miembros, las ordenes mas importantes son update y draw, con update, actualizamos todos sprites (en el caso de que se hayan movido, cambiado de tamaño, etc) y con draw estamos haciendo un blit de la superficie que esta incluida en cada sprite (al comienzo habiamos dicho que los sprite pueden contener superficies y antes habiamos hablado de que la funcion blit sirve para pegar una superficie en otra), entonces si escribimos

grupo_enemigos.draw(screen_sup)

Es como si hicieramos un blit por cada superficie que esta incluida en el grupo de sprites

screen_sup.blit(imagen_enemigo1)
screen_sup.blit(imagen_enemigo2)
….

Hay que recordar que al final de todo debemos escribir pygame.display.flip() como ya habíamos explicado.

Espero que haya aclarado algunas dudas, por lo menos ahora no estoy tan perdido. Seria recomendable que lean “Conceptos Básicos para el desarrollo de videojuegos”  y esta “Introduccion a Pygame

Muchos de los conceptos de este post fueron tomados de allí.

Powered by ScribeFire.

Make a Comment

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Una respuesta to “Nociones fundamentales de pygame”

RSS Feed for Aprendiendo a Programar en Python con PyGame para hacer Video Juegos Comments RSS Feed

hola necesito saver como poner 2 objetos en pygame.
por ej tengo una nave y quiero disparar apretando espacio como lo ago xao
grax de antemano


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

A %d blogueros les gusta esto: