Menu
CoddyTech

Son déclenché par un événement

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

Un son correspond à un instant : la pièce est ramassée, la porte s’ouvre, l’ennemi est touché. Ton code prévoit déjà un emplacement pour chaque instant : le if qui modifie le jeu lorsque l’événement se produit. Joue le son dans ce même if :

if player.colliderect(coin):
    score += 1
    coin_sound.play()
    coin.x = random.randint(20, 444)

Le if n’est vrai que pendant une seule image, car la pièce se déplace pendant cette même image. Le son est donc joué une fois par pièce.

Joué ailleurs, le son perd le bon moment. Dans le code de dessin, sous if score > 0:, il redémarrerait à chaque image après la première pièce : 60 fois par seconde, produisant un long bourdonnement.

challenge icon

Défi

Facile

Le carré vert ramasse des pièces avec les touches fléchées. Ajoute un son à chaque pièce :

  1. Avant la boucle, charge assets/sounds/coin.ogg dans coin_sound.
  2. Joue-le dans le if qui ramasse la pièce, une fois par pièce.

Essayez vous-même

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Coins")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 160, 40, 40)
coin = pygame.Rect(100, 100, 16, 16)
score = 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]:
        player.x -= 5
    if keys[pygame.K_RIGHT]:
        player.x += 5
    if keys[pygame.K_UP]:
        player.y -= 5
    if keys[pygame.K_DOWN]:
        player.y += 5
    player.clamp_ip(screen.get_rect())

    if player.colliderect(coin):
        score += 1
        coin.x = random.randint(20, 444)
        coin.y = random.randint(50, 324)

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 210, 60), coin)
    pygame.draw.rect(screen, (90, 200, 120), player)
    score_text = font.render(f"Coins: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    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