Razón Artificial

La ciencia y el arte de crear videojuegos

Pygame III: Cargar imágenes

Escrito por adrigm el 14 de febrero de 2010 en Desarrollo Videojuegos, Noticias, Programación | 45 Comentarios.

En el primer tutorial aprendimos a importar e inicializar, En la segunda parte a crear una ventana y en este aprenderemos a cargar imagenes y a mostrarlas en pantalla.

Cargando imagenes

Para cargar una imagen en Pygame vamos a usar una función que está muy bien y facilita mucho el cargar imágenes al vuelo, pongo la función y la explicamos línea por línea:

def load_image(filename, transparent=False):
        try: image = pygame.image.load(filename)
        except pygame.error, message:
                raise SystemExit, message
        image = image.convert()
        if transparent:
                color = image.get_at((0,0))
                image.set_colorkey(color, RLEACCEL)
        return image


La línea 1 define la función, recibe dos parámetros el nombre/ruta del archivo y la segunda si tiene parte transparente (por defecto definida como falso).

La línea 2 asigna a la variable imagen la imagen a través de la función de Pygame pygame.image.load() si se puede sino, en la líneas 3 y 4 manejan el error y salen del programa.

La línea 5 convierte la imagen al tipo interno de Pygame que hace que sea mucho más eficiente.

Las línea 6 es un condicional que controla si el parámetro transparent es verdadero y en caso afirmativo ejecuta las líneas 7 y 8, la primera obtiene el color del pixel (0, 0) de la imagen (esquina superior izquierda) y la la línea 8 lo define como color transparente de la imagen. Es decir que si quieres una imagen con transparencia, el color que actúa como transparente se toma del pixel superior izquierdo, así que asegúrate que este color no está en la imagen.

Por último la línea 9 retorna la imagen después de todo el proceso.

El programa nos queda así:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Módulos
import sys, pygame
from pygame.locals import *

# Constantes
WIDTH = 640
HEIGHT = 480

# Clases
# ---------------------------------------------------------------------

# ---------------------------------------------------------------------

# Funciones
# ---------------------------------------------------------------------

def load_image(filename, transparent=False):
        try: image = pygame.image.load(filename)
        except pygame.error, message:
                raise SystemExit, message
        image = image.convert()
        if transparent:
                color = image.get_at((0,0))
                image.set_colorkey(color, RLEACCEL)
        return image

# ---------------------------------------------------------------------

def main():
	screen = pygame.display.set_mode((WIDTH, HEIGHT))
	pygame.display.set_caption("Pruebas Pygame")
	while True:
		for eventos in pygame.event.get():
			if eventos.type == QUIT:
				sys.exit(0)
	return 0

if __name__ == '__main__':
	pygame.init()
	main()

Poniendo un fondo

Vamos a poner un fondo a nuestra ventana usando nuestra función load_image. Lo primero es descargar el fondo y guardarlo en la carpeta images del directorio de trabajo.

Para cargar la imagen usaremos la siguiente línea, la ponemos justo antes de entrar en el bucle del juego:

background_image = load_image('images/fondo.jpg')

Como ves no definimos color transparente, porque para el fondo no es necesario.

Ahora necesitamos “ponerla en la ventana” para ello dentro del bucle principal debemos definir que imagen poner y en que posición:

screen.blit(background_image, (0, 0))

Esto es lo que hace es poner la imagen la pantalla sobre las que había, recibe dos parámetros (en realidad algunos más), la imagen a poner y en que lugar situar la esquina superior izquierda de la imagen, en este caso (0, 0), es decir, queremos que la esquina superior izquierda de la imagen este en la posición (0, 0), con esto conseguimos que el fondo ocupe toda la ventana (si la imagen es mayor o superior a la ventana, claro está).

por último, como última línea del bucle debemos incluir la siguiente línea:

pygame.display.flip()

Esto lo que hace es actualizar toda la ventana para que se muestren los cambios que han sucedido.

El programa nos queda de la siguiente manera:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Módulos
import sys, pygame
from pygame.locals import *

# Constantes
WIDTH = 640
HEIGHT = 480

# Clases
# ---------------------------------------------------------------------

# ---------------------------------------------------------------------

# Funciones
# ---------------------------------------------------------------------

def load_image(filename, transparent=False):
        try: image = pygame.image.load(filename)
        except pygame.error, message:
                raise SystemExit, message
        image = image.convert()
        if transparent:
                color = image.get_at((0,0))
                image.set_colorkey(color, RLEACCEL)
        return image

# ---------------------------------------------------------------------

def main():
	screen = pygame.display.set_mode((WIDTH, HEIGHT))
	pygame.display.set_caption("Pruebas Pygame")

	background_image = load_image('images/fondo.jpg')

	while True:
		for eventos in pygame.event.get():
			if eventos.type == QUIT:
				sys.exit(0)

		screen.blit(background_image, (0, 0))
		pygame.display.flip()
	return 0

if __name__ == '__main__':
	pygame.init()
	main()

Bien con esto hemos conseguido poner una imagen de fondo y tener una forma fácil de cargar imagenes en Pygame. Aconsejo guardar esto como plantilla base de Pygame, pues en casi todos los juegos necesitaremos cargar imagenes y establecer un fondo por defecto.

En el siguiente tutorial empezaremos a crear nuestro primer juego, un Pong, utilizando sptrites (imagenes con movimientos), colisiones entradas por teclado y demás cosas.

45 Comentarios en "Pygame III: Cargar imágenes"

  1. […] parte 1, parte 2 y parte 3 nos sirvieron como introducción a Pygame, aprendimos a iniciar pygame, crear ventanas y poner […]

  2. El Gera dice:

    Me podés aclarar unas dudas?
    Primero, para qué son estas lineas…
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    …? Las saco y no pasa nada.

    Y segundo, tengo que poner el path entero en el load_image, si pongo sólo “images\\fondo.jpg” tira error (uso windows).

  3. admin dice:

    La primera línea ejecuta python directamente sin tener que llamar al interprete, es decir: archivo.py en lugar de python archivo.py

    La Segunda es la codificación de caracteres, utf-8, para poder poner tildes, eñes y demás.

    Eso es porque no tienes la carpeta imágenes dentro del directorio del archivo.

  4. El Gera dice:

    Hola, gracias por responder.

    Pero si saco esas líneas, no cambia nada cuando ejecuto el programa, aunque use eñes y tildes…

    Y sí tengo un directorio images con un archivo fondo.jpg dentro, pero tengo que escribir la ruta completa en la función. “C:\\Python26\\proyectos\\pygame\\images\\fondo.jpg”, si pongo eso funciona (el archivo está en el directorio pygame). Creo que si el directorio estuviera en C:\ funcionaría sólo poniendo “images\\fondo.jpg”.

    • Rey V M dice:

      si pones solo fondo.jpg tambien te funcionara, el images\bla bla bla es por que donde tienes tu codigo si hubiera una carpeta al lado llamada “images” y dentro el archivo fondo.jpg funcionaria.

  5. brayan dice:

    ola oe pygame esta muy chvr
    oe una consulta
    como puedo hacer para que mi imagen se extienda
    en casi todo el fondo

  6. Dokan dice:

    Es tontería responder a estas alturas la duda de los directorios, pero aún así por si sirve a alguien más.
    Hace tiempo me encontré en una situación parecida usando windows, lo solucioné así; “..\images\fondo.jpg”, es la manera de que el sistema interprete que tiene que buscar a partir de la carpeta donde se ejecuta, si no se hace así hay que poner la ruta completa como le ha pasado a El Gera. Puede que me equivoque puesto que hace tiempo que no uso windows, pero creo recordar que era así.

  7. adrigm dice:

    Dokan con ..\ le estás indicando que es el directorio padre, es decir fuera de la carpeta en la que esta nuestro archivo hay otra llamada images, y eso no es así, la carpeta images esta en el directorio que se encuentra el archivo por lo que lo correcto sería images\fondo.jpg

    la única diferencia sería la barra invertida propia del sistema de Microsoft.

  8. neonigma dice:

    Pero qué tutorial más útil y bien elaborado… ¡enhorabuena!

  9. Andrés dice:

    ¿es necesario poner la imagen de fondo dentro del bucle eterno?

    Me imagino que colocarla fuera del bucle mejoraría ligeramente el rendimiento, y en fin, el fondo no debe actualizarse cada vez

  10. adrigm dice:

    Andrés, sí que es necesario, tienes que saber como funciona el copiado de superficies para entenderlo. La ventana es una superficie y tu copias en ella otras superficies, si luego vuelves a copiar otra superficie encima (la pelota en otra posición, por ejemplo) la anterior no se borra, la forma de borrar la pantalla es volviendo a poner el fondo.

    Prueba a sacar el fondo del bucle y verás.

  11. julian9512 dice:

    Antes que nada muy buen post, me esta sirviendo un monton en el camino de programar con python juegos. Mi problema es que a la hora de ejecutar python me tira un error diciendome que no puede cargar la imagen que puse para background, la verdad es que no entiendo por qué, intente de todo. Y bueno lo que queria saber es que te parece que lo puede estar causando.

  12. adrigm dice:

    julian9512, pon el error que te da Python para poder decirte.

  13. julian9512 dice:

    ESTO ES LO QUE TENGO ESCRITO:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    # Módulos
    import sys, pygame
    from pygame.locals import *

    # Constantes
    WIDTH = 640
    HEIGHT = 480

    # Clases
    # ———————————————————————

    # ———————————————————————

    # Funciones
    # ———————————————————————

    def load_image(imagen, transparent=False):
    try: image = pygame.image.load(imagen)
    except pygame.error, message:
    raise SystemExit, message
    image = image.convert()
    if transparent:
    color = image.get_at((0,0))
    image.set_colorkey(color, RLEACCEL)
    return image

    # ———————————————————————

    def main():
    screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption(“Pruebas Pygame”)

    background = load_image(“C:\\Python26\\fondo.jpg”)

    while True:
    for eventos in pygame.event.get():
    if eventos.type == QUIT:
    sys.exit(0)

    screen.blit(background, (0, 0))
    pygame.display.flip()
    return 0

    if __name__ == ‘__main__':
    pygame.init()
    main()

    Y ESTE EL ERROR QUE ME TIRA PYTHON:

    Couldn’t open C:\Python26\fondo.jpg

  14. julian9512 dice:

    adrigm no te preocupes por responder fue un error mio, crei que cuando decias directorio base te referias al directorio donde se encuentra el python.exe y no donde se encuentra nuestro trabajo.

  15. adrigm dice:

    Perdona no había visto el comentario anterior, si si el directorio base es donde está el script no donde está el ejecutable de Python. Por eso te pedía el error.

    Siento no haber leido antes, pero ya lo tienes solucionado. =)

  16. Carla Martinez dice:

    Una pregunta.. como le hago para cargar imagenes desde una carpeta? porque eso solo me funciona cuando las tengo en el desktop! es el mismo codigo para cuando este en una carpeta?

  17. adrigm dice:

    Puedes usar rutas relativas por ejemplo tu tienes tu juego en una carpeta llamada juego y dentro uan carpeta llamada images con las imagenes, para acceder a ella desde los scripts puedes usar “image/mi_imagen.png”

  18. Zaladin dice:

    Me da un error en la parte de message me dice q no esta definido, para q version de python esta este tutorial ya q yo uso el 3.1…Lo arregle poniendole parentesis pero ahora me tira un error en el background(0,0)

    screen.blit(background_image,(0,0))
    TypeError: argument 1 must be pygame.Surface, not str

    ese es el error espero q puedan ayudarme :)

  19. DoLpHiN dice:

    Me sumo a los que opinan de que éste es un tutorial muy bien elaborado, claramente explicado, y fácil de seguir, muchas gracias por compartir tus conocimientos, son de gran utilidad para los que estamos comenzando tanto con Python como con Pygame. Muchas gracias. A continuar con el siguiente capítulo…
    Saludos

  20. Maria dice:

    Hola! Copié tu código tal cual pero cuando lo corro me aparece este error:

    File “bola1.py”, line 31
    except pygame.error, message:
    ^
    SyntaxError: invalid syntax

    creo que es la coma lo que no le gusta pero no entiendo por qué. Estoy usando python3.2. Gracias!

  21. adrigm dice:

    Los tutos son para Python 2.x

  22. kupo dice:

    Hola, muchas gracias por publicar este tuto. Pude hacer que muestre la imagen (640×480, 39,9 KiB), pero el asunto es que cada vez que se está ejecutando el programa, consume más del 50% de procesador!. Utilizo python 2.6.6 y Debian 6. Qué opinás?. Gracias por tu tiempo!.

  23. Mike Hawk dice:

    Hola, soy nuevo en pygame y tengo un problema, me gustaría que me echaran una mano.

    Hasta este punto todo me ah salido muy bien, pero hay un pequeño problema, dice que tengo un error de sintaxis:

    except pygame.error, message:

    la coma que esta después de pygame.error es la que me causa problemas.

    Estoy usando python 3.2.2

    Si me pudieran ayudar se los agradecería. :)

  24. Mike Hawk dice:

    Oh y por si a caso, ya vi que es un tutorial para python 2.x pero si alguien tiene la solución de verdad que agradecería demasiado si me ayudan.

    • adrigm dice:

      Dime exactamente que línea es la que te da error y te podré decir, pero será complicado que los sigas con Python 3.x si no conoces le sintaxis de Python 2.x No cambia mucho, pero tienes que mirar como se hacen las cosas en Python 2.x

  25. Mike Hawk dice:

    01#!/usr/bin/env python
    02# -*- coding: utf-8 -*-
    03
    04# Módulos
    05import sys, pygame
    06from pygame.locals import *
    07
    08# Constantes
    09WIDTH = 640
    10HEIGHT = 480
    11
    12# Clases
    13# —————————————–
    14
    15# —————————————–
    16
    17# Funciones
    18# —————————————–
    19
    20def load_image(filename,transparent=False):
    21try: image = pygame.image.load(filename)
    22 except pygame.error, message:
    23 raise SystemExit, message
    24 image = image.convert()
    25 if transparent:
    26 color = image.get_at((0,0))
    27 image.set_colorkey(color, RLEACCEL)
    28 return image
    29
    30# —————————————–
    31
    32def main():
    33 screen =pygame.display.set_mode((WIDTH, HEIGHT))
    34pygame.display.set_caption(“PruebasPygame”)
    35 while True:
    36 for eventos in pygame.event.get():
    37 if eventos.type == QUIT:
    38 sys.exit(0)
    39 return 0
    40
    41if __name__ == ‘__main__':
    42 pygame.init()
    43 main()

  26. Mike Hawk dice:

    Es error de sintaxis

  27. Mike Hawk dice:

    Ya lo arregle, gracias!

  28. Fernando dice:

    Sos groso sabelo!
    No podia hacer que el fondo de una imagen sea transparente… con tu ayuda lo logre.

  29. Silvia dice:

    Estoy intentando cargar una imagen, lo hago en el emacs y cuando lo llamo desdel shell, me da error:

    import cargar_imatges
    >>> cargar_imatges.load_image(‘daus.png’)
    Traceback (most recent call last):
    File “”, line 1, in
    File “cargar_imatges.py”, line 7, in load_image
    raise SystemExit, message
    pygame.error: cannot convert without pygame.display initialized

    que es lo del convert?? q no lo entiendo bien.

    si alguien sabe lo q es..me iria muy bien la ayuda.
    gracias

  30. […] Pygame III: Cargar imágenes […]

  31. jevsan dice:

    Muy buen tutorial, de verdad muy bien explicado. Aunque tengo el mismo problema que algunos compañeros allá arriba:

    Estoy usando python 3.2.3 y me marca el siguiente error de sintaxis:

    except pygame.error, message:
    ^

    Sin embargo, si cargo el programa con python 2.x el programa corre sin mayor problema, ¿será algún problema de pygame?

    Si alguien tiene una respuesta se la agradecería mucho.

    De antemano gracias y muy buenos tutoriales, sigan así ;)

  32. Inés dice:

    Muy buen tutorial! pero tengo una duda. Si mi imagen es más pequeña que la pantalla, como hago para agrandarla para que quede fullscreen?
    Gracias

  33. Sergi dice:

    No se porque poniendo el mismo codigo de ahí me pone error de sintaxis en la linea 22 y 23

  34. jose dice:

    se tiene que aprender cada codigo para que sirve? o no

  35. Leandro dice:

    Hola adrigm, estoy siguiendo tu tutorial y es muy fácil de entender.
    Me trabé con este error, me podrías orientar por favor?

    /usr/bin/python2.7 /home/leandro/PycharmProjects/juegos/juego01.py
    Traceback (most recent call last):
    File “/home/leandro/PycharmProjects/juegos/juego01.py”, line 48, in
    main()
    File “/home/leandro/PycharmProjects/juegos/juego01.py”, line 42, in main
    screen.blit(background_image, (0, 0))
    TypeError: argument 1 must be pygame.Surface, not None

    Process finished with exit code 1

    Saludos.
    Leandro

  36. Imagenes dice:

    Tremendo tutorial, mejor explicado imposible, gracias me fue muy útil para aprender a cargar imagenes!

  37. serdeliverance dice:

    Buenisimo tutorial!!. Empece a estudiar python y pygame para enseñarle programación a mi hermana (y de paso profundizar un poco yo también) y este curso me esta siendo muy útil. Muchas gracias.

  38. Andres dice:

    ¿Como puedo hacer para que una imagen o “sprite” salga dividida en partes pequeñas?
    Tengo en una sola imagen con todos los movimientos del personaje, no se si me explico

  39. Angel Vargas dice:

    Hola, buen tutorial. Relativo al tema, podrían ayudarme a comprender como puedo crear una subventana con pygame??

Deja un comentario