Menu
CoddyTech

Sons et touches maintenues

Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 4 sur 23.

Maintiens la barre d’espace enfoncée et le vaisseau tire un laser toutes les 12 images. Le code de départ joue le son du laser ainsi :

if keys[pygame.K_SPACE]:
    laser_sound.play()
    if cooldown == 0:
        lasers.append(...)

keys[pygame.K_SPACE] est vrai à chaque image où la touche est enfoncée. Ainsi, tant que tu maintiens la barre d’espace, le son démarre 60 fois par seconde, alors que seuls 5 lasers sont tirés. Tu entends un bourdonnement désagréable au lieu de tirs.

La solution est la même règle qu’avant : joue le son au moment où l’action se produit. Un tir se produit dans if cooldown == 0:, donc le son se joue à cet endroit :

if keys[pygame.K_SPACE]:
    if cooldown == 0:
        lasers.append(...)
        laser_sound.play()

Maintenant, chaque laser a son son, et rien d’autre n’en produit. Pour une action qui se produit une fois par pression, comme un saut, joue le son dans l’événement KEYDOWN : il y a un événement par pression, quelle que soit la durée pendant laquelle la touche reste enfoncée.

challenge icon

Défi

Facile

Maintiens la barre d’espace et le vaisseau tire un laser toutes les 12 images, mais le son bourdonne. Déplace laser_sound.play() pour qu’il soit joué une fois pour chaque laser tiré : dans la branche if cooldown == 0:, après l’ajout du laser.

Essayez vous-même

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()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Son et sensations de jeu

Entraînez-vous par vous-même : Playground Pygame