C5 - Sons et textes
1 - Importer et jouer des sons
Charger un fichier audio
Similairement aux images, nous devons d'abord créer un objet Sound
depuis le module mixer en spécifiant le chemin d'accès au fichier :
sound_effect = pygame.mixer.Sound("audio/sf.wav")
Warning
Formats compatibles : .wav, .mp3 et .ogg, tous les autres formats de fichier audio sont incompatibles avec pygame. Nous sommes donc contraint de convertir les fichiers .flac par exemple.
Jouer un bruitage
Il suffit d'appeler la méthode play
associée aux objets Sound
. Ainsi dans le code suivant :
bruitage = pygame.mixer.Sound("audio/bruitage.mp3")
bruitage.play()
Nous pourrons clairement entendre bruitage.mp3
au démarrage du jeu.
Modifier le volume d'un son
Il arrive qu'un son n'ait pas le volume adapté. Pas de panique ! La méthode set_volume
nous aidera sans problème. La syntaxe pour set_volume
est la suivante :
sound_object.set_volume(coeff)
coeff
représente le coefficient par lequel le volume initial du son associé sera multiplié. Ainsi l'instruction :
sound_object.set_volume(2.0)
Doublera le volume du son sound_object
. Mais l'instruction ci-dessous :
sound_object.set_volume(0.5)
Divisera au contraire le volume du son sound_object
de moitié. Alors que l'instruction qui suit :
sound_object.set_volume(0.0)
Mettra le volume à 0. Nous ne pourrons plus entendre sound_object
.
Musique en boucle
La méthode play
peut prendre un paramètre loops
indiquant le nombre de fois qu'un son doit être joué à la suite. Si ce paramètre vaut \(-1\), le son sera constamment joué jusqu'à ce qu'on appelle la méthode stop
qui permet d'interrompre un son. Supposons la situation suivante :
Supposons deux musiques => jazz et rock
Jouer jazz en boucle
Si on appuie sur la barre espace:
Changer de musique
Ce que nous pouvons traduire en Python par un code qui ressemble à celui-là :
rock = pygame.mixer.Sound("audio/rock.mp3")
jazz = pygame.mixer.Sound("audio/jazz.mp3")
playing_jazz = True
jazz.play(-1)
while is_running:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
if playing_jazz:
jazz.stop()
rock.play(-1)
else:
rock.stop()
jazz.play(-1)
Cependant, nous pouvons procéder d'une autre manière. A la place d'employer stop
, nous pouvons simplement mettre le volume d'une musique à 0. Les deux musiques ne seront ainsi pas contraintes à être jouées depuis le début puisque nous ne les interrompons pas :
rock = pygame.mixer.Sound("audio/rock.mp3")
jazz = pygame.mixer.Sound("audio/jazz.mp3")
playing_jazz = True
initialised_rock = False
jazz.play(-1)
while is_running:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
if playing_jazz:
jazz.set_volume(0.0)
if not initialised_rock:
rock.play(-1)
initialised_rock = True
rock.set_volume(1.0)
else:
rock.set_volume(0.0)
jazz.set_volume(1.0)
2 - Textes
Il est possible de faire apparaître du texte sur l'écran de notre jeu.
Initialiser une police et un texte
Avec Pygame, les textes sont construits à partir d'une police, c'est-à-dire d'un objet Font
. Vous pouvez initialiser un objet Font
à partir d'une police téléchargée sur Internet et plus particulièrement un fichier .ttf comme celui-ci par exemple :
police = pygame.font.Font("pkmnem.ttf", 24)
Ou sinon à partir d'une police qui existe déjà sur votre système grâce à la fonction SysFont
:
police = pygame.font.SysFont("arial", 24)
Info
Vous pouvez obtenir toutes les polices qui existent sur votre système grâce à la fonction pygame.font.get_fonts()
Le deuxième paramètre, le 24, représente la taille de la police. Désormais que nous avons notre police, nous pouvons initialiser un texte grâce à la méthode render
associée à la police. La syntaxe pour initialiser un texte est la suivante :
texte_jeu = police.render(texte, antialias, couleur)
texte
équivaut au texte que vous souhaitez afficher. antialias
est une valeur booléenne. Si cette dernière vaut True, on obtiendra un rendu 'lisse' du texte. Il est recommandé de donner la valeur True à ce paramètre la plupart du temps. Enfin couleur
représente la couleur du texte affiché. Ce paramètre peut être une chaîne de caractère comme "red"
par exemple, mais le plus souvent, il s'agira d'un tuple qui contient trois nombres entiers de 0 à 255. En effet, ce tuple s'agit d'un codage RGB et les trois nombres entiers à l'intérieur de celui-ci représentent respectivement l'intensité du rouge, du vert et du bleu de la couleur.
Afficher le texte
Les textes sont conidérés comme toute autre surface. C'est-à-dire qu'ils fonctionnent de la même manière que les images. Nous pouvons les afficher avec la méthode blit
et nous pouvons les placer à partir d'un rectangle. Par exemple, en supposant que nous souhaitons écrire le texte "Victoire !!!" en orange et au centre d'un écran gris, nous écririons le code suivant :
police = pygame.font.SysFont("arial", 38)
victory_text = police.render("Victoire !!!", True, (255, 150, 0))
victory_rect = victory_text.get_rect(center=(screen_width / 2, screen_height / 2))
while running:
# Boucle évènementielle
screen.fill((128, 128, 128))
screen.blit(victory_text, victory_rect)
# Update et tick
Nous pouvons également déplacer un texte. Imaginons la situation suivante:
Placer texte à gauche en dehors de l'écran
Tant que le texte n'est pas au centre de l'écran:
Déplacer texte vers la droite
Attendre 1.5 secondes
Tant que texte n'est pas en dehors de l'écran:
Déplacer rapidement texte vers la droite
Idée que nous pouvons visualiser grâce à la vidéo ci-dessous :
Exercice
A vous de jouer ! Essayez de programmer la situation précèdente.
police = pygame.font.SysFont("arial", 50)
scrolling = police.render("Meanwhile", True, (255, 255, 255))
scrolling_rect = scrolling.get_rect(center=(-100, screen_height / 2))
scroll_speed = 15
continuing_scroll = False
setting_timer = True
resume_scroll = pygame.USEREVENT + 1
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == resume_scroll:
continuing_scroll = True
scroll_speed *= 2
if scrolling_rect.centerx < screen_width / 2 or continuing_scroll:
scrolling_rect.x += scroll_speed
elif setting_timer:
pygame.time.set_timer(resume_scroll, 1500, 1)
setting_timer = False
screen.fill((0, 0, 0))
screen.blit(scrolling, scrolling_rect)
pygame.display.update()
clock.tick(60)
Conclusion
Nous devrions maintenant être capable d'inclure des textes et des sons dans notre jeu. Reprenons donc le jeu que nous avons programmé au chapitre précédent durant le challenge final et embeillissons le ! Dans votre jeu ajoutez :
- Un bruitage chaque fois que la balle rebondit contre le mur ou une raquette
- Une musique
- Un système de score. Le joueur devra pouvoir consulter son score affiché sur l'écran du jeu