Curso de videojuegos con Pygame

Música y control de volumen con Pygame

Capítulo 6: Música de fondo y controles de volumen para el jugador

En este sexto capítulo, podrás ver cómo crear un sistema completo de audio en Pygame con música de fondo y controles de volumen.

Para cargar una música en Pygame lo debes hacer así:

pygame.mixer.music.load('sonido/intergalactic_odyssey.ogg')

Y para reproducirla, lo harás con un play.
Si entre los paréntesis ponemos un 1 la música se reproducirá una sola vez.
Si pones un número 'x', se reproducirá 'x' veces.
Finalmente, con un valor de -1 se reproducirá en bucle infinito.

pygame.mixer.music.play(1)

Para los controles de sonido he cargado unas cuantas imágenes que se van a mostrar con la tecla correspondiente.

Sonido en Pygame
sonido_arriba = pygame.image.load('sonido/volume_up.png')
sonido_abajo = pygame.image.load('sonido/volume_down.png')
sonido_mute = pygame.image.load('sonido/volume_muted.png')
sonido_max = pygame.image.load('sonido/volume_max.png')

Puedes descargar los archivos que utilizo yo, o bien, utilizar los tuyos propios, faltaría más.
Descargar imágenes de audio.

También te dejo la descarga de la imagen original por si quieres modificarla a tu gusto:
Descargar imagen original.

Para el control del nivel de volumen lo haremos con set_volume.
Especificaremos un número decimal del 0.0 al 1.0.

pygame.mixer.music.set_volume(1.0)

Puedes ver en el siguiente código completo del capítulo o en el vídeo de arriba, cómo asignar las imágenes y el control de volumen a las teclas.

import pygame
import sys

# Iniciación de Pygame
pygame.init()

# Pantalla - ventana
W, H = 1000, 600
PANTALLA = pygame.display.set_mode((W, H))
pygame.display.set_caption('Exterminator')
icono=pygame.image.load('icon.png')
pygame.display.set_icon(icono)

# Fondo del juego
fondo = pygame.image.load('imagenes/fondos/ciudad.png')

# Música de fondo
pygame.mixer.music.load('sonido/intergalactic_odyssey.ogg')
pygame.mixer.music.play(-1)


# Personaje
quieto = pygame.image.load('imagenes/principal/idle1.png')

caminaDerecha = [pygame.image.load('imagenes/principal/run1.png'),
				pygame.image.load('imagenes/principal/run2.png'),
				pygame.image.load('imagenes/principal/run3.png'),
				pygame.image.load('imagenes/principal/run4.png'),
				pygame.image.load('imagenes/principal/run5.png'),
				pygame.image.load('imagenes/principal/run6.png')]

caminaIzquierda = [pygame.image.load('imagenes/principal/run1-izq.png'),
				pygame.image.load('imagenes/principal/run2-izq.png'),
				pygame.image.load('imagenes/principal/run3-izq.png'),
				pygame.image.load('imagenes/principal/run4-izq.png'),
				pygame.image.load('imagenes/principal/run5-izq.png'),
				pygame.image.load('imagenes/principal/run6-izq.png')]

salta = [pygame.image.load('imagenes/principal/jump1.png'),
		pygame.image.load('imagenes/principal/jump2.png')]

# Sonido
sonido_arriba = pygame.image.load('sonido/volume_up.png')
sonido_abajo = pygame.image.load('sonido/volume_down.png')
sonido_mute = pygame.image.load('sonido/volume_muted.png')
sonido_max = pygame.image.load('sonido/volume_max.png')

x=0
px = 50
py = 200
ancho = 40
velocidad = 10

# Control de FPS
reloj = pygame.time.Clock()

# Variables salto
salto = False
# Contador de salto
cuentaSalto = 10

# Variables dirección
izquierda = False
derecha = False

# Pasos
cuentaPasos = 0

# Movimiento
def recargaPantalla():
	# Variables globales
	global cuentaPasos
	global x

	# Fondo en movimiento
	x_relativa = x % fondo.get_rect().width
	PANTALLA.blit(fondo, (x_relativa - fondo.get_rect().width, 0))
	if x_relativa < W:
		PANTALLA.blit(fondo, (x_relativa, 0))
	x -= 5
	# Contador de pasos
	if cuentaPasos + 1 >= 6:
		cuentaPasos = 0
	# Movimiento a la izquierda
	if izquierda:
		PANTALLA.blit(caminaIzquierda[cuentaPasos // 1], (int(px), int(py)))
		cuentaPasos += 1

		# Movimiento a la derecha
	elif derecha:
		PANTALLA.blit(caminaDerecha[cuentaPasos // 1], (int(px), int(py)))
		cuentaPasos += 1

	elif salto + 1 >= 2:
		PANTALLA.blit(salta[cuentaPasos // 1], (int(px), int(py)))
		cuentaPasos += 1

	else:
		PANTALLA.blit(quieto,(int(px), int(py)))

ejecuta = True

# Bucle de acciones y controles
while ejecuta:
	# FPS
	reloj.tick(18)

	# Bucle del juego
	for event in pygame.event.get():
		if event.type == pygame.QUIT:
			ejecuta = False

	# Opción tecla pulsada
	keys = pygame.key.get_pressed()

	# Tecla A - Moviemiento a la izquierda
	if keys[pygame.K_a] and px > velocidad:
		px -= velocidad
		izquierda = True
		derecha = False

	# Tecla D - Moviemiento a la derecha
	elif keys[pygame.K_d] and px < 900 - velocidad - ancho:
		px += velocidad
		izquierda = False
		derecha = True

	# Personaje quieto
	else:
		izquierda = False
		derecha = False
		cuentaPasos = 0

	# Tecla W - Moviemiento hacia arriba
	if keys[pygame.K_w] and py > 100:
		py -= velocidad

	# Tecla S - Moviemiento hacia abajo
	if keys[pygame.K_s] and py < 300:
		py += velocidad
	# Tecla SPACE - Salto
	if not (salto):
		if keys[pygame.K_SPACE]:
			salto = True
			izquierda = False
			derecha = False
			cuentaPasos = 0
	else:
		if cuentaSalto >= -10:
			py -= (cuentaSalto * abs(cuentaSalto)) * 0.5
			cuentaSalto -= 1
		else:
			cuentaSalto = 10
			salto = False

	# Control del audio
	# Baja volumen
	if keys[pygame.K_9] and pygame.mixer.music.get_volume() > 0.0:
		pygame.mixer.music.set_volume(pygame.mixer.music.get_volume() - 0.01)
		PANTALLA.blit(sonido_abajo, (850, 25))
	elif keys[pygame.K_9] and pygame.mixer.music.get_volume() == 0.0:
		PANTALLA.blit(sonido_mute, (850, 25))

	# Sube volumen
	if keys[pygame.K_0] and pygame.mixer.music.get_volume() < 1.0:
		pygame.mixer.music.set_volume(pygame.mixer.music.get_volume() + 0.01)
		PANTALLA.blit(sonido_arriba, (850, 25))
	elif keys [pygame.K_0] and pygame.mixer.music.get_volume() == 1.0:
			PANTALLA.blit(sonido_max, (850, 25))

	# Desactivar sonido
	elif keys[pygame.K_m]:
		pygame.mixer.music.set_volume(0.0)
		PANTALLA.blit(sonido_mute, (850, 25))

	# Reactivar sonido
	elif keys[pygame.K_COMMA]:
		pygame.mixer.music.set_volume(1.0)
		PANTALLA.blit(sonido_max, (850, 25))

	# Actualización de la ventana
	pygame.display.update()
	# Llamada a la función de actualización de la ventana
	recargaPantalla()

# Salida del juego
pygame.quit()

Comentarios

Si te quedan dudas sobre el temario, sobre Python, Pygame o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.

Programación Fácil YouTube

Suscríbete

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.