Entrada destacada

Como usar enums en Android, kotlin

Cómo agregar imágenes y audio en pygame (ejemplo)


Cargar imágenes

Para cargar una imagen usamos pygame.image.load("ruta"), el parámetro ruta va entre paréntesis y puede ser una ruta relativa o absoluta. En nuestro caso, como usamos 3 imágenes usamos un arreglo para almacenar las imágenes ya cargadas para después poder renderizarlas.

def cargarImages():
    img = []
    img.append(pygame.image.load("images/giraffe.png"))
    img.append(pygame.image.load("images/hippo.png"))
img.append(pygame.image.load("images/parrot.png"))

Para poder mostrar una imagen en la escena usamos pantalla.blit(imagen, pos), donde pantalla es un objeto pygame.display. Como usamos un arreglo de imágenes para poder dibujarlas usamos un for.


    for img in imagenes:
        picture = pygame.transform.scale(img, [30, 30])
        pantalla.blit(picture, [10, 10])

Con pygame.transform.scale podemos modificar el tamaño de las imágenes en nuestro caso a 30x30 pixeles y después la dibujamos en la posición (10,10). Podemos dibujar las imágenes sin escalarlas.


Cargar sonidos

Para cargar sonidos usamos pygame.mixer.load("ruta") y para reproducir el sonido usamos audio.play().

def cargarSonidos():
    sounds = []
    sounds.append(pygame.mixer.Sound('sound/boop.wav'))
    sounds.append(pygame.mixer.Sound('sound/fire.wav'))
    sounds.append(pygame.mixer.Sound('sound/laser4.wav'))
    return sounds

sonidos = cargarSonidos()
sonidos[0].play()

Código fuente.


ClickSound.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import pygame

FONDO = (30, 155, 255)
ROJO = (232, 47, 28)


def colisiono(mouse, objeto):
    if (mouse[0] > objeto[0] and mouse[0] < objeto[0] + objeto[2]) and (mouse[1] > objeto[1] and mouse[1] < objeto[1] + objeto[3]):
        return True
    return False


def reproducirSonido(audio):
    audio.play()


def buscarPulsado(posMouse, listaRects):
    for cuadro in listaRects:
        if(colisiono(posMouse, cuadro[1] + cuadro[2])):
            reproducirSonido(cuadro[3])


def cargarImages():
    img = []
    img.append(pygame.image.load("images/giraffe.png"))
    img.append(pygame.image.load("images/hippo.png"))
    img.append(pygame.image.load("images/parrot.png"))
    return img


def cargarSonidos():
    sounds = []
    sounds.append(pygame.mixer.Sound('sound/boop.wav'))
    sounds.append(pygame.mixer.Sound('sound/fire.wav'))
    sounds.append(pygame.mixer.Sound('sound/laser4.wav'))
    return sounds

pygame.init()

dimensiones = [400, 300]
pantalla = pygame.display.set_mode(dimensiones)
pygame.display.set_caption(" Click Play Sound")
imgs = cargarImages()
sounds = cargarSonidos()
listaRects = [
    [imgs[0],[20, 20], [80, 80], sounds[0]],
    [imgs[1],[125, 50], [100, 100], sounds[1]],
    [imgs[2], [230, 150], [120, 120], sounds[2]]
]

game_over = False
reloj = pygame.time.Clock()

while not game_over:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            game_over = True
        if evento.type == pygame.MOUSEBUTTONDOWN :
            pos = pygame.mouse.get_pos()
            buscarPulsado(pos, listaRects)
    pantalla.fill(FONDO)
    for cuadro in listaRects:
        picture = pygame.transform.scale(cuadro[0], cuadro[2])
        pantalla.blit(picture, cuadro[1])
    pygame.display.flip()
    reloj.tick(10)

pygame.quit()

Ahora veamos que hace cada una de las funciones que compone el programa anterior.

def colisiono(mouse, objeto):
    if (mouse[0] > objeto[0] and mouse[0] < objeto[0] + objeto[2]) and (mouse[1] > objeto[1] and mouse[1] < objeto[1] + objeto[3]):
        return True
    return False

La función colisiono recibe como los parámetros mouse (posición del cursor del ratón) y objeto que son la posición y medidas del objeto de la pantalla. Con la función colisiono  se determina si el puntero del ratón está dentro del área de un objeto con forma rectangular, si la condición se cumple se devuelve verdadero.


def reproducirSonido(audio):
    audio.play()
La función reproducirSonido reproduce el audio que corresponde al objeto que ha sido pulsado, el parámetro que recibe es un audio previamente cargado.

def buscarPulsado(posMouse, listaRects):
    for cuadro in listaRects:
        if(colisiono(posMouse, cuadro[1] + cuadro[2])):
            reproducirSonido(cuadro[3])
Para buscar dentro del arreglo de objetos cual ha sido pulsado usamos la función buscarPulsado la cual usa como parámetros las posiciones del ratón y la lista de rectángulos, y usando un for recorremos la lista dentro del bucle buscando con la función colisiono si el puntero del ratón está dentro del rectángulo en cuestión, si colisiono nos devuelve verdadero reproducimos el audio del objeto, el cual está almacenado en el 4to indice de la lista que representa a cada objeto.


pygame.init()

dimensiones = [400, 300]
pantalla = pygame.display.set_mode(dimensiones)
pygame.display.set_caption(" Click Play Sound")
imgs = cargarImages()
sounds = cargarSonidos()
listaRects = [
    [imgs[0],[20, 20], [80, 80], sounds[0]],
    [imgs[1],[125, 50], [100, 100], sounds[1]],
    [imgs[2], [230, 150], [120, 120], sounds[2]]
]

game_over = False
reloj = pygame.time.Clock()
Continuando con el código hacemos las configuraciones generales para la pantalla y llamamos a las funciones que cargan las imágenes y los sonidos. Después creamos la lista de rectángulos, los rectángulos a su vez están representados como una lista de atributos, su imagen, sus posiciones en (x,y), sus medidas y su audio. Las dos lineas finales son la variable que controla la terminación del programa y el reloj que nos ayuda a controlar los frames por segundo. 


while not game_over:
    for evento in pygame.event.get():
        if evento.type == pygame.QUIT:
            game_over = True
        if evento.type == pygame.MOUSEBUTTONDOWN :
            pos = pygame.mouse.get_pos()
            buscarPulsado(pos, listaRects)
    pantalla.fill(FONDO)
    for cuadro in listaRects:
        picture = pygame.transform.scale(cuadro[0], cuadro[2])
        pantalla.blit(picture, cuadro[1])
    pygame.display.flip()
    reloj.tick(10)

pygame.quit()
Dentro del bucle principal podemos destacar el if que detecta si se ha pulsado un botón del ratón ya sea izquierdo o derecho, si pasa esto se obtienen las coordenadas del cursor del mouse y se llama a la función buscarPulsado.
Después de limpiar el fondo de la pantalla con el color de fondo predefinido, se dibujan los rectángulos con la ayuda de un for.

Recursos.
Imágenes y sonidos en las paginas de los autores:
https://kenney.nl/assets/animal-pac
https://opengameart.org/

Archivos fuente del proyecto.
Repositorio del proyecto

Comenta tus dudas en la sección de comentarios.



Comentarios