TOC

This article is currently in the process of being translated into French (~99% done).

Création d'un jeu : SnakeWPF:
Chapter introduction:

In this article series, we're building a complete Snake game from scratch. It makes sense to start with the Introduction and then work your way through the articles one by one, to get the full understanding.

If you want to get the complete source code for the game at once, to get started modifying and learning from it right now, consider downloading all our samples!

Improving SnakeWPF: Adding sound

La plupart des jeux auront des effets sonores pour améliorer l'expérience, mais jusqu'ici, notre petite version de Snake est totalement silencieuse. Nous avons parlé de l'audio et la vidéo précédemment dans ce tutoriel, donc si vous avez lu ces articles, vous savez que lire des sons avec WPF est assez simple. En fait, si vous pouvez vivre avec les sons système, ça peut être fait en une seule ligne de code :

SystemSounds.Beep.Play();

Si vous avez besoin d'un peu plus que ça, vous pouvez utiliser la classe MediaPlayer pour lire vos propres fichiers audio (par exemple MP3). Vous pouvez en savoir plus à ce sujet en lisant cet article : Playing audio with WPF. Un petit projet amusant peut être d'enregistrer un son de vous en train de croquer une pomme et de le lire quand le serpent mange une pomme, c'est assez simple à faire !

Faire parler le serpent

Pour ce tutoriel, j'ai décidé de prendre une autre voie que de simplement lire des sons classiques de morsures, je souhaite que le serpent parle ! Ça peut sembler difficile, mais seulement si vous n'avez pas lu tous les articles de ce tutoriel, parce que si c'est le cas, vous savez que WPF supporte très bien la synthèse vocale. Grâce à ça, nous pouvons faire parler le serpent très facilement !

Pour commencer, vous devez ajouter une référence à l'assembly System.Speech à votre projet. Pour des instructions détaillées sur la manière d'ajouter cet assembly à votre projet, vous pouvez lire cet article précédent : Speech synthesis (making WPF talk). En haut, vous trouverez la marche à suivre pas à pas.

J'ai décidé de faire parler le serpent dans différentes situations, je vais donc créer une instance SpeechSynthesizer commune que je réutiliserai à chaque fois, mais commençons par ajouter une référence à l'espace de nom System.Speech.Synthesis en haut :

using System.Speech.Synthesis;

Ensuite, déclarez et initialisez l'instance en haut de votre fenêtre :

public partial class MainWindow : Window
{
private SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
.......

"Miam !"

C'est tout ce que nous avons à faire pour faire parler le serpent, mais quand doit-il parler, et que doit-il dire ? J'ai décidé de le faire dire "miam" chaque fois qu'il mange une pomme. Ça se passe dans la méthode EatSnakeFood() que nous avons implémentée précédemment, ajoutez donc simplement une ligne en haut de cette procédure :

private void EatSnakeFood()
{
    speechSynthesizer.SpeakAsync("yummy");
    ......

C'est tout, lancez le jeu et appréciez le "miam" à chaque fois que le serpent mange une pomme. Bien sûr le texte peut être remplacé par un autre mot ou même une phrase si vous le souhaitez.

"Oh non - vous êtes mort !"

Dire "miam" est super simple, comme vous pouvez le voir, mais SpeechSynthesizer peut faire beaucoup plus que ça. Pour le démontrer, j'ai décidé de faire annoncer au serpent sa propre mort, et le score final de la partie, en d'autres termes, nous devons ajouter quelques dialogues à la méthode EndGame(). Il y aura pas mal de nouvelles lignes de code, parce que je souhaite plusieurs phrases, avec différents paramétrages de dialogues, j'ai donc décidé d'encapsuler le code de dialogue de fin de partie dans sa propre méthode appelée SpeakEndOfGameInfo(). On l'appelle en bas de la méthode EndGame(), implémentée précédemment dans ce tutoriel, ajoutez donc simplement l'appel en bas de la méthode :

private void EndGame()
{
    .......
    SpeakEndOfGameInfo(isNewHighscore);
}

Voici à quoi ressemble notre implémentation de tout ceci :

private void SpeakEndOfGameInfo(bool isNewHighscore)  
{  
    PromptBuilder promptBuilder = new PromptBuilder();  

    promptBuilder.StartStyle(new PromptStyle()  
    {  
Emphasis = PromptEmphasis.Reduced,  
Rate = PromptRate.Slow,  
Volume = PromptVolume.ExtraLoud  
    });  
    promptBuilder.AppendText("oh no");  
    promptBuilder.AppendBreak(TimeSpan.FromMilliseconds(200));  
    promptBuilder.AppendText("you died");  
    promptBuilder.EndStyle();  

    if(isNewHighscore)  
    {  
promptBuilder.AppendBreak(TimeSpan.FromMilliseconds(500));  
promptBuilder.StartStyle(new PromptStyle()  
{  
    Emphasis = PromptEmphasis.Moderate,  
    Rate = PromptRate.Medium,  
    Volume = PromptVolume.Medium  
});  
promptBuilder.AppendText("new high score:");  
promptBuilder.AppendBreak(TimeSpan.FromMilliseconds(200));  
promptBuilder.AppendTextWithHint(currentScore.ToString(), SayAs.NumberCardinal);  
promptBuilder.EndStyle();  
    }  
    speechSynthesizer.SpeakAsync(promptBuilder);  
}

C'est donc pas mal de code, mais si vous regardez tout ça de plus près, vous verrez que c'est beaucoup la même chose, nous utilisons essentiellement une instance de PromptBuilder pour créer une phrase plus longue, avec des paramétrage de prononciations variés. Au final, cela fera dire au serpent "Oh non, vous êtes mort" à chaque fois que vous mourrez. Si vous figurez au tableau des meilleurs scores, ajouté dans un article précédent, il ajoutera "Nouveau meilleur score :" suivi de votre score.

Chaque partie de ce dialogue est prononcée avec le paramétrage approprié, en utilisant des instances de PromptStyle, par exemple, "Oh non, vous êtes mort !" est dit lentement, avec un volume plus élevé. Nous utilisons aussi la méthode AppendBreak() pour ajouter des pauses naturelles entre les différentes parties. Vous pouvez en savoir plus sur ces techniques dans notre précédent article sur la synthèse vocale.

Résumé

Grâce à l'assembly System.Speech et à la classe SpeechSynthesizer, notre serpent vient d'apprendre à parler ! Ça rend notre jeu un peu plus amusant, tout en démontrant à quel point le framework .NET est cool, puissant et flexible.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!