Musique pour chaque état
Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 6 sur 23.
Chaque état d’un jeu peut avoir sa propre musique : un thème calme dans le menu, un morceau entraînant pendant que tu joues, une courte mélodie quand tu gagnes ou perds. Pour changer de musique, charge le nouveau morceau et lance-le. Le chargement d’un nouveau morceau arrête l’ancien. Une petite fonction regroupe les deux lignes :
def play_music(path, loops=-1):
pygame.mixer.music.load(path)
pygame.mixer.music.play(loops)Change la musique au moment où l’état change, sur la ligne qui définit state :
if player.colliderect(goal):
state = "win"
play_music("assets/music/win.ogg", 0)Cette ligne s’exécute une seule fois, donc le morceau démarre une seule fois. Ne change pas la musique dans if state == "win": dans la partie dessin : ce code s’exécute à chaque image et redémarre le morceau 60 fois par seconde.
Les mélodies de victoire et de défaite sont courtes et se terminent d’elles-mêmes ; elles prennent donc la valeur 0 pour loops. Le thème et le morceau du niveau se répètent avec -1.
Défi
MoyenAppuyez sur Entrée pour lancer la partie ; le carré bleu gagne en atteignant l’objectif vert et perd dans la lave. Associez une musique à chaque état :
- Écrivez
play_music(path, loops=-1)pour charger et lire une piste. - Avant la boucle, lisez
assets/music/theme.ogg. - Lorsque l’état devient
"play", lisezassets/music/level.ogg. - Lorsqu’il devient
"win", lisezassets/music/win.oggune fois (loops 0) ; pour"lose", lisezassets/music/lose.oggune fois. - Lorsque la touche Entrée ramène à
"menu", lisez à nouveau theme.ogg.
Essayez vous-même
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Lava Run")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
player = pygame.Rect(40, 160, 30, 30)
goal = pygame.Rect(420, 160, 30, 30)
lava = pygame.Rect(0, 320, 480, 40)
state = "menu"
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
if state == "menu":
state = "play"
player.topleft = (40, 160)
elif state in ("win", "lose"):
state = "menu"
if state == "play":
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.x -= 4
if keys[pygame.K_RIGHT]:
player.x += 4
if keys[pygame.K_UP]:
player.y -= 4
if keys[pygame.K_DOWN]:
player.y += 4
player.clamp_ip(screen.get_rect())
if player.colliderect(goal):
state = "win"
elif player.colliderect(lava):
state = "lose"
screen.fill((30, 30, 46))
if state == "menu":
title = font.render("Press Enter to start", True, (240, 240, 240))
screen.blit(title, title.get_rect(center=(240, 180)))
else:
pygame.draw.rect(screen, (230, 90, 40), lava)
pygame.draw.rect(screen, (90, 200, 120), goal)
pygame.draw.rect(screen, (80, 160, 255), player)
if state == "win":
message = font.render("You win!", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 100)))
elif state == "lose":
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 100)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Toutes les leçons de Son et sensations de jeu
4Tremblement de l’écran et flash d’impact
Tremblement de l’écranFlash d’impactArrêt sur impactRester subtilEntraînez-vous par vous-même : Playground Pygame