Música de fondo y controles de volumen para el jugador - Curso Pygame - Capítulo 6


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í:

Código Python

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.

Código Python

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

Código Python

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')

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

Código Python

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.

Código Python

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()

Suscríbete a mi canal de YouTube para apoyarme

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.


Comentarios

Si te quedan dudas sobre el temario, sobre Python, 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.