Sons e Teclas Mantidas Pressionadas
Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 4 de 23.
Mantenha Espaço pressionada e a nave dispara um laser a cada 12 quadros. O código inicial reproduz o som do laser assim:
if keys[pygame.K_SPACE]:
laser_sound.play()
if cooldown == 0:
lasers.append(...)keys[pygame.K_SPACE] é verdadeira em todos os quadros em que a tecla está pressionada. Então, enquanto você mantém Espaço pressionada, o som começa 60 vezes por segundo, embora apenas 5 lasers voem. Você ouve um zumbido áspero em vez de disparos.
A solução segue a mesma regra de antes: reproduza o som no local onde a ação acontece. Um disparo acontece dentro de if cooldown == 0:, então o som fica ali:
if keys[pygame.K_SPACE]:
if cooldown == 0:
lasers.append(...)
laser_sound.play()Agora cada laser tem seu som, e nada mais o reproduz. Para uma ação que acontece uma vez por pressionamento, como um salto, reproduza o som no evento KEYDOWN: há um evento por pressionamento, independentemente de quanto tempo a tecla fica pressionada.
Desafio
FácilSegure a barra de espaço e a nave dispara um laser a cada 12 quadros, mas o som fica zumbindo. Mova laser_sound.play() para que ele toque uma vez para cada laser disparado: para dentro do bloco if cooldown == 0:, depois que o laser for adicionado.
Experimente você mesmo
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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Som e sensação de jogo
4Vibração da Tela e Flash de Impacto
Vibração da TelaFlash de ImpactoPausa no ImpactoMantenha a DiscriçãoPratique por conta própria: Playground de Pygame