Fonctionnalités bonus
De la couleur, des pauses et du son pour des programmes plus vivants.
Après cette fiche, vous saurez :
- afficher du texte en couleur
- faire une pause avec Thread.Sleep
- faire un bip avec Console.Beep
- préparer un fichier .wav et le jouer avec SoundPlayer
À retenir
Cette fiche est facultative. Rien ici n'est nécessaire pour réussir les fiches précédentes. Ces outils servent à rendre vos jeux plus agréables.
Vous connaissez déjà deux outils de console utiles : Console.Clear() et
Console.ReadKey(), vus à la fiche 6.
1De la couleur
Par défaut, tout s'affiche en gris clair sur fond noir. Vous pouvez changer la couleur du texte avant de l'afficher.
Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Aïe ! Vous perdez 10 points de vie."); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Vous trouvez 10 pièces d'or."); Console.ResetColor(); Console.WriteLine("Retour à la couleur normale.");
Aïe ! Vous perdez 10 points de vie. Vous trouvez 10 pièces d'or. Retour à la couleur normale.
Dans la fenêtre noire, la première ligne s'affiche en rouge, la deuxième en jaune, et la troisième retrouve sa couleur normale.
Console.ForegroundColor règle la couleur du texte. La couleur reste
active pour tout ce qui suit, jusqu'à ce que vous la changiez à nouveau ou que vous
écriviez Console.ResetColor();.
| Pour obtenir | J'écris |
|---|---|
| Rouge | ConsoleColor.Red |
| Vert | ConsoleColor.Green |
| Jaune | ConsoleColor.Yellow |
| Bleu clair | ConsoleColor.Cyan |
| Rose | ConsoleColor.Magenta |
| Blanc | ConsoleColor.White |
Visual Studio vous propose toute la liste dès que vous tapez
ConsoleColor. avec le point. Les versions foncées commencent par
Dark : DarkRed, DarkGreen, DarkBlue...
La couleur de fond
Console.BackgroundColor = ConsoleColor.DarkBlue; Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(" LE DONJON DE RADAKASS "); Console.ResetColor();
BackgroundColor colore le fond, mais seulement derrière les caractères
que vous écrivez ensuite.
Attention
N'oubliez pas Console.ResetColor();
Sans lui, tout ce que le programme affiche ensuite garde la dernière couleur choisie, y compris les questions posées à l'utilisateur. Prenez l'habitude de remettre la couleur normale juste après le message coloré.
2Faire une pause
Parfois, on veut que le programme attende un peu : suspense, compte à rebours,
animation. C'est le rôle de Thread.Sleep.
Console.WriteLine("Vous poussez la porte..."); Thread.Sleep(2000); Console.WriteLine("Un monstre apparaît !");
Vous poussez la porte... Un monstre apparaît !
Le deuxième message n'apparaît qu'après deux secondes.
| J'écris | Le programme attend |
|---|---|
Thread.Sleep(500); | une demi-seconde |
Thread.Sleep(1000); | une seconde |
Thread.Sleep(3000); | trois secondes |
À retenir
La durée s'exprime en millisecondes : 1000 millisecondes font 1 seconde.
Pendant la pause, le programme ne fait plus rien. Gardez des pauses courtes (une à trois secondes) pour ne pas donner l'impression qu'il est bloqué.
Attention
Si Thread est souligné en rouge, ajoutez cette ligne tout en haut
du fichier, avant toutes les autres :
using System.Threading;
3Faire un bip
Console.Beep(); // un bip standard Console.Beep(1000, 300); // 1000 hertz pendant 300 ms
Avec deux nombres, vous choisissez le son : le premier est la fréquence (plus elle est grande, plus le son est aigu), le second la durée en millisecondes. Essayez des valeurs entre 400 et 2000.
Deux notes qui montent pour une victoire :
Console.Beep(800, 200); Console.Beep(1200, 400);
Attention
Le programme attend la fin du bip avant de passer à la ligne suivante.
Le bip avec fréquence ne fonctionne que sous Windows. Pensez à vos voisins : testez à faible volume.
4Jouer un son avec SoundPlayer
Pour une vraie musique de victoire ou un cri de monstre, C# peut jouer un fichier
son. On utilise SoundPlayer.
Attention
Deux limites à connaître.
- Il ne lit que les fichiers .wav. Un fichier .mp3 ne fonctionnera pas.
- Il ne fonctionne que sous Windows.
Étape 1 : se procurer un son en .wav
En classe, nous procédons en deux temps : télécharger un .mp3, puis le convertir en .wav.
- Allez sur myinstants.com, cherchez un son court (quelques secondes) et téléchargez-le. Vous obtenez un fichier .mp3.
- Allez sur un site de conversion comme Convertio (convertio.co). Déposez votre .mp3, choisissez le format WAV et lancez la conversion.
- Téléchargez le fichier .wav obtenu.
- Donnez-lui un nom simple, sans espaces ni accents :
victoire.wav,defaite.wav.
Attention
Renommer un .mp3 en .wav ne sert à rien. Le contenu du fichier reste du mp3 et le son ne se jouera pas. Il faut bien passer par la conversion.
Ne déposez sur un site de conversion que des sons pour la classe, jamais de documents personnels.
Étape 2 : ajouter le son à votre projet
- Dans l'Explorateur de solutions, faites un clic droit sur le nom de votre projet, puis Ajouter, puis Élément existant... Choisissez votre fichier .wav. (Vous pouvez aussi le glisser directement dans l'Explorateur de solutions.)
- Cliquez sur le fichier .wav dans l'Explorateur de solutions, puis regardez la fenêtre Propriétés.
- Pour la ligne Copier dans le répertoire de sortie, choisissez Copier si plus récent.
À retenir
Pourquoi cette dernière étape ? Votre programme ne s'exécute pas dans le dossier
où se trouvent vos fichiers de code, mais dans un dossier de sortie (bin\Debug\...).
Le son doit être copié à côté du programme, sinon SoundPlayer ne le trouve
pas.
Étape 3 : jouer le son
using System.Media; SoundPlayer victoire = new SoundPlayer("victoire.wav"); Console.WriteLine("Bravo, vous avez gagné !"); victoire.Play(); Console.ReadKey(); // sans cette ligne, le programme se termine et coupe le son
La ligne using System.Media; se place tout en haut du fichier. Elle
dit à C# où trouver SoundPlayer. Le nom entre guillemets doit être
exactement celui du fichier, avec son extension .wav.
| Je veux | J'écris |
|---|---|
| Jouer le son, et continuer le programme pendant qu'il joue | victoire.Play(); |
| Jouer le son, et attendre qu'il soit fini | victoire.PlaySync(); |
| Rejouer le son en boucle | victoire.PlayLooping(); |
| Arrêter le son | victoire.Stop(); |
Si SoundPlayer est souligné en rouge
Selon la version de .NET de votre projet, SoundPlayer n'est pas reconnu
d'office. Visual Studio affiche une erreur du type « Le nom de type SoundPlayer est
introuvable ». Il faut alors installer un petit module :
- Clic droit sur le nom de votre projet, puis Gérer les packages NuGet...
- Onglet Parcourir, puis tapez
System.Windows.Extensionsdans la barre de recherche. - Choisissez ce package et cliquez sur Installer.
L'erreur disparaît, et vous pouvez compiler.
Le son ne se joue pas ?
- Le nom dans le code est-il identique à celui du fichier, extension comprise ?
- Le fichier est-il bien un vrai .wav, obtenu par conversion ?
- La propriété Copier dans le répertoire de sortie est-elle sur Copier si plus récent ?
- Le programme ne se termine-t-il pas trop vite ? Ajoutez un
Console.ReadKey();à la fin, ou utilisezPlaySync(). - Le volume de l'ordinateur est-il activé ?
À retenir
Pour jouer un son : un fichier .wav, copié dans le répertoire de sortie, la ligne
using System.Media;, puis new SoundPlayer("nom.wav") et
Play().
→Exercices
Écrivez un compte à rebours de lancement de fusée.
- Affichez 5, 4, 3, 2, 1, un nombre à la fois, avec une seconde entre chaque. L'écran est effacé avant chaque nombre.
- Terminez par « Décollage ! » en vert, suivi d'un bip aigu.
- Remettez la couleur normale, puis attendez une touche avant de fermer.
Aide : une boucle for qui descend utilise i--
au lieu de i++ (fiche 11).
Solution
for (int i = 5; i >= 1; i--) { Console.Clear(); Console.WriteLine(i); Thread.Sleep(1000); } Console.Clear(); Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Décollage !"); Console.ResetColor(); Console.Beep(1500, 500); Console.ReadKey();
La boucle descend. i commence à 5, la boucle continue tant que
i >= 1, et i-- retire 1 à chaque tour.
L'ordre compte à l'intérieur de la boucle. On efface, on affiche le nombre, puis on attend. Si on attendait avant d'afficher, on verrait un écran vide pendant une seconde.
Le Clear() après la boucle efface le dernier chiffre avant le
message final.
Reprenez le jeu du dé (fiche 9, exercice 4) et ajoutez de la couleur et du son.
- Préparez deux sons en .wav, comme dans la section 4 :
victoire.wavetdefaite.wav. Ajoutez-les au projet. - Si le dé donne 6 : message en vert et son de victoire.
- Si le dé donne 1 : message en rouge et son de défaite.
- Pour tous les autres résultats : le message habituel, sans son.
Solution
using System.Media; Random de = new Random(); SoundPlayer victoire = new SoundPlayer("victoire.wav"); SoundPlayer defaite = new SoundPlayer("defaite.wav"); int lancer = de.Next(1, 7); Console.WriteLine($"Vous lancez le dé : {lancer}"); if (lancer == 6) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Un six ! Vous rejouez."); Console.ResetColor(); victoire.PlaySync(); } else if (lancer == 1) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Un un... vous passez votre tour."); Console.ResetColor(); defaite.PlaySync(); } else { Console.WriteLine($"Vous avancez de {lancer} cases."); } Console.ReadKey();
Le using System.Media; est la toute première ligne, avant le reste du
programme.
Les deux SoundPlayer sont créés au début, comme le
Random : une fois pour toutes, avant de les utiliser.
Pourquoi PlaySync() ici ? Le programme attend la fin du son avant
de continuer. Avec Play(), le son se jouerait en même temps que la suite,
ce qui est aussi correct grâce au ReadKey() final.
Pensez au ResetColor() avant de jouer le son : le texte coloré
est déjà affiché, la couleur n'a plus à rester active.
Je sais faire
- Je sais afficher du texte en couleur et remettre la couleur normale.
- Je sais faire une pause avec Thread.Sleep.
- Je sais faire un bip avec Console.Beep.
- Je sais préparer un fichier .wav (téléchargement puis conversion).
- Je sais jouer un son avec SoundPlayer.
Une case qui coince ? Relisez la partie concernée avant de passer à la fiche suivante.