This article has been localized into Italian by the community.
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!
Miglioramento di SnakeWPF: aggiunta dei suoni
La maggior parte dei giochi avrà effetti sonori per migliorare l'esperienza, ma finora la nostra implementazione di piccoli serpenti è completamente silenziosa. In questo tutorial abbiamo già parlato sia dell'audio che del video, quindi se hai letto questi articoli, sai che riprodurre un suono con WPF è abbastanza semplice. In effetti, se riesci a convivere con i suoni di sistema, puoi farlo con una sola riga di codice:
SystemSounds.Beep.Play();
Se hai bisogno di qualcosa in più, puoi utilizzare la classe MediaPlayer per riprodurre i tuoi file audio (ad esempio MP3). Puoi leggere tutto in questo articolo: Riproduzione audio con WPF . Un piccolo progetto divertente potrebbe essere quello di registrare il suono del tuo morso di una mela e poi suonarlo quando il serpente mangia una mela - è abbastanza facile da realizzare!
Far parlare the Snake
Per questo tutorial, ho deciso di andare in un altro modo rispetto a suonare solo normali morsi di suono: voglio che Snake parli! Questo può sembrare difficile, ma solo se non hai letto tutti gli articoli di questo tutorial, perché se lo hai, sai che WPF ha un ottimo supporto per Speech synthesis. Con questo, possiamo far parlare il serpente molto facilmente!
Prima di tutto, devi aggiungere un riferimento all'assembly System.Speech al tuo progetto. Per istruzioni specifiche su come aggiungere esattamente questo assembly al progetto, consultare questo articolo precedente: Speech synthesis (making WPF talk). Nella prima parte troverai una guida dettagliata su come ottenere questo risultato.
Ho deciso di far parlare Snake in diverse situazioni, quindi creerò un'istanza SpeechSynthesizer comune che riutilizzerò ogni volta. Si inizia aggiungendo un riferimento al namespace System.Speech.Synthesis:
using System.Speech.Synthesis;
Quindi devi dichiarare e inizializzare l'istanza nella parte superiore della Window:
public partial class MainWindow : Window
{
private SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
.......
"Delizioso!"
Questo è tutto ciò di cui abbiamo bisogno per far parlare Snake, ma quando dovrebbe parlare e cosa dovrebbe dire? Ho deciso di farlo dire "yummy" (buonissimo) ogni volta che mangia una mela. Questo accade nel metodo EatSnakeFood () che abbiamo implementato in precedenza, quindi aggiungi una sola riga nella parte superiore:
private void EatSnakeFood()
{
speechSynthesizer.SpeakAsync("yummy");
......
Ecco fatto: avvia il gioco e goditi il "yummy" ogni volta che il serpente mangia una mela. Ovviamente la stringa di testo può essere cambiata in un'altra parola o anche una frase.
"Oh no: sei morto!"
Dire "yummy" è super semplice, come puoi vedere, ma il SpeechSynthesizerpuò fare molto di più! Per dimostrarlo, ho deciso di far parlare il serpente della propria morte e del punteggio finale del gioco - in altre parole, dobbiamo aggiungere alcuni discorsi al metodo EndGame() . Ci saranno alcune righe di codice aggiuntivo, perché voglio diverse frasi con impostazioni vocali diverse, quindi ho deciso di incapsulare il codice di fine gioco nel suo metodo chiamato SpeakEndOfGameInfo() . Viene chiamato nella parte inferiore del metodo EndGame() , implementato in precedenza in questo tutorial, quindi aggiungi semplicemente la chiamata nella parte inferiore del metodo:
private void EndGame()
{
.......
SpeakEndOfGameInfo(isNewHighscore);
}
Ecco come appare la nostra implementazione:
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);
}
Devi scrivere un po' di codice, ma se guardi più da vicino, vedrai che ci sono un sacco di cose uguali - fondamentalmente usiamo un'istanza PromptBuilder per creare una frase più lunga, con varie impostazioni di pronuncia. Alla fine, questo farà dire al serpente "Oh no - you died" ogni volta che muori. Se il tuo punteggio è finito nell'elenco dei punteggi migliori, aggiunto in uno degli articoli precedenti, verrà aggiunto "New high score" seguito dal punteggio effettivo.
Ogni parte di questo viene pronunciata con le impostazioni appropriate, usando le istanze PromptStyle - per esempio, "oh no - you died" viene pronunciato lentamente, con un volume maggiore. Utilizziamo anche il metodo AppendBreak () per aggiungere interruzioni naturali tra le diverse parti. Puoi leggere ulteriori informazioni su queste tecniche nel nostro articolo precedente sulla sintesi vocale .
Riepilogo
Grazie alla libreria System.Speech e alla classe SpeechSynthesizer, il nostro Snake ha appena imparato a parlare! Questo rende il gioco molto più divertente, dimostrando quanto sia bello, potente e flessibile il framework .NET.