Dźwięki i przytrzymane klawisze
Część sekcji Dźwięk i odczucia z gry ścieżki Pygame w Coddy. Lekcja 4 z 23.
Przytrzymaj spację, a statek będzie strzelał laserem co 12 klatek. Początkowy kod odtwarza dźwięk lasera w ten sposób:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE] ma wartość true w każdej klatce, gdy klawisz jest wciśnięty. Gdy więc przytrzymujesz spację, dźwięk rozpoczyna się 60 razy na sekundę, chociaż wystrzeliwanych jest tylko 5 laserów. Zamiast strzałów słychać chrapliwy brzęk.
Rozwiązanie jest takie samo jak poprzednio: odtwarzaj dźwięk w miejscu, w którym dzieje się dana rzecz. Strzał następuje wewnątrz if cooldown == 0:, więc tam należy odtwarzać dźwięk:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()Teraz każdy laser ma swój dźwięk i nic więcej go nie odtwarza. W przypadku akcji, która następuje raz na naciśnięcie klawisza, na przykład skoku, odtwarzaj dźwięk w zdarzeniu KEYDOWN: jedno zdarzenie przypada na każde naciśnięcie, niezależnie od tego, jak długo klawisz pozostaje wciśnięty.
Wyzwanie
ŁatwyPrzytrzymaj spację, a statek będzie strzelać laserem co 12 klatek, ale dźwięk brzęczy. Przenieś laser_sound.play(), tak aby odtwarzał się raz przy każdym wystrzelonym laserze: do gałęzi if cooldown == 0:, za dodanie lasera.
Spróbuj swoich sił
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()
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Dźwięk i odczucia z gry
1Efekty dźwiękowe
Wczytywanie dźwiękuDźwięk w reakcji na zdarzenieGłośność dźwiękuDźwięki i przytrzymane klawisze4Wstrząs ekranu i błysk po trafieniu
Wstrząs ekranuBłysk po trafieniuPauza przy trafieniuNie przesadzajPoćwicz samodzielnie: Edytor online Pygame