Suoni e tasti tenuti premuti
Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 4 di 23.
Tieni premuto Spazio e la nave spara un laser ogni 12 fotogrammi. Il codice iniziale riproduce il suono del laser così:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE] è true a ogni fotogramma in cui il tasto è premuto. Quindi, mentre tieni premuto Spazio, il suono parte 60 volte al secondo, anche se vengono sparati solo 5 laser. Senti un ronzio stridente invece degli spari.
La soluzione segue la stessa regola di prima: riproduci il suono quando si verifica l'azione. Uno sparo avviene dentro if cooldown == 0:, quindi il suono va inserito lì:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()Ora ogni laser ha il suo suono e nient'altro lo riproduce. Per un'azione che avviene una volta per pressione, come un salto, riproduci il suono nell'evento KEYDOWN: c'è un evento per ogni pressione, indipendentemente da quanto a lungo il tasto rimane premuto.
Sfida
FacileTieni premuto Space e la nave spara un laser ogni 12 fotogrammi, ma il suono ronza. Sposta laser_sound.play() in modo che venga riprodotto una volta per ogni laser sparato: nel ramo if cooldown == 0:, dopo aver aggiunto il laser.
Provalo tu
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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Suoni e sensazioni di gioco
1Effetti sonori
Caricare un suonoSuono al verificarsi di un eventoVolume del suonoSuoni e tasti tenuti premuti4Scuotimento dello schermo e flash all’impatto
Scuotimento dello schermoFlash all’impattoPausa all’impattoMantienilo discretoEsercitati da solo: Playground Pygame