Pygame III: Cargar imágenes
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.
[…] parte 1, parte 2 y parte 3 nos sirvieron como introducción a Pygame, aprendimos a iniciar pygame, crear ventanas y poner […]
[…] Pygame III: Cargar imágenes […]
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).
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.
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».
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.
ola oe pygame esta muy chvr
oe una consulta
como puedo hacer para que mi imagen se extienda
en casi todo el fondo
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í.
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.
Pero qué tutorial más útil y bien elaborado… ¡enhorabuena!
¿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
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.
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.
julian9512, pon el error que te da Python para poder decirte.
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
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.
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. =)
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?
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»
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 :)
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
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!
Los tutos son para Python 2.x
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!.
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. :)
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.
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
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()
Hola, Son las lineas 22 y 23 las que me dan problemas solamente.
Si pones el error que te da te podré ayudar.
Es error de sintaxis
Ya lo arregle, gracias!
Sos groso sabelo!
No podia hacer que el fondo de una imagen sea transparente… con tu ayuda lo logre.
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
[…] Pygame III: Cargar imágenes […]
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í ;)
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
No se porque poniendo el mismo codigo de ahí me pone error de sintaxis en la linea 22 y 23
cambia las lineas por esto:
except pygame.error as message:
raise SystemExit(message)
se tiene que aprender cada codigo para que sirve? o no
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
Tremendo tutorial, mejor explicado imposible, gracias me fue muy útil para aprender a cargar imagenes!
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.
¿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
Hola, buen tutorial. Relativo al tema, podrían ayudarme a comprender como puedo crear una subventana con pygame??
No entiendo, ¿dónde guardo fondo.jpg?
me podrian ayudar porfavor,
cuando ejecuto el script me indica que
, = invalid syntax
y que image = invalid syntax