Sonidos y teclas presionadas
Parte de la sección Sonido y sensaciones del juego del Journey de Pygame de Coddy. Lección 4 de 23.
Mantén pulsada la barra espaciadora y la nave dispara un láser cada 12 fotogramas. El proyecto inicial reproduce el sonido del láser así:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE] es verdadero en cada fotograma que la tecla está pulsada. Así que, mientras mantienes pulsada la barra espaciadora, el sonido empieza 60 veces por segundo, aunque solo vuelan 5 láseres. Oyes un zumbido áspero en lugar de disparos.
La solución es la misma regla que antes: reproduce el sonido donde ocurre la acción. Un disparo ocurre dentro de if cooldown == 0:, así que el sonido va ahí:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()Ahora cada láser tiene su sonido y nada más lo reproduce. Para una acción que ocurre una vez por pulsación, como un salto, reproduce el sonido en el evento KEYDOWN: hay un evento por pulsación, por mucho tiempo que se mantenga pulsada la tecla.
Desafío
FácilMantén presionada la barra espaciadora y la nave dispara un láser cada 12 fotogramas, pero el sonido zumba. Mueve laser_sound.play() para que se reproduzca una vez por cada láser disparado: dentro de la rama if cooldown == 0:, después de añadir el láser.
Pruébalo tú mismo
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Lasers")
clock = pygame.time.Clock()
laser_sound = pygame.mixer.Sound("assets/sounds/laser.ogg")
laser_sound.set_volume(0.5)
ship = pygame.Rect(220, 300, 40, 30)
lasers = []
cooldown = 0
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
ship.x -= 5
if keys[pygame.K_RIGHT]:
ship.x += 5
ship.clamp_ip(screen.get_rect())
if cooldown > 0:
cooldown -= 1
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(pygame.Rect(ship.centerx - 2, ship.top - 12, 4, 12))
cooldown = 12
for laser in lasers:
laser.y -= 8
lasers = [laser for laser in lasers if laser.bottom > 0]
screen.fill((30, 30, 46))
for laser in lasers:
pygame.draw.rect(screen, (255, 230, 90), laser)
pygame.draw.rect(screen, (80, 200, 230), ship)
pygame.display.flip()
clock.tick(60)
pygame.quit()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Sonido y sensaciones del juego
1Efectos de sonido
Cargar un sonidoSonido al ocurrir un eventoVolumen del sonidoSonidos y teclas presionadas4Sacudida de pantalla y destello de impacto
Sacudida de pantallaDestello de impactoPausa tras el impactoMantén la sutilezaPractica por tu cuenta: Playground de Pygame