This article has been localized into German 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!
SnakeWPF verbessern: Sound hinzufügen
Die meisten Spiele werden Soundeffekte haben, um die Erfahrung zu verbessern, aber bisher ist unsere kleine Schlangenimplementierung völlig leise. In diesem Tutorial wurde bereits sowohl über Audio als auch über Video gesprochen. Wenn Sie also diese Artikel gelesen haben, wissen Sie, dass das Abspielen eines Sounds mit WPF recht einfach ist. Wenn Sie mit den Systemtönen leben können, kann dies mit einer einzigen Codezeile geschehen:
SystemSounds.Beep.Play();
Wenn Sie etwas mehr benötigen, können Sie die MediaPlayer -Klasse verwenden, um Ihre eigenen Audiodateien (z. B. MP3) abzuspielen. In diesem Artikel erfahren Sie alles darüber: Audio mit WPF abspielen. Ein lustiges kleines Projekt könnte sein, den Sound von dir aufzuzeichnen, wie du einen Apfelbissen nimmst und ihn dann spielst, wenn die Schlange einen Apfel isst - das ist ganz einfach!
Die Schlange zum Reden bringen
In diesem Tutorial habe ich beschlossen, einen anderen Weg zu gehen als nur normale Soundbits zu spielen - ich möchte, dass die Schlange spricht! Dies mag schwierig klingen, aber nur, wenn Sie nicht alle Artikel in diesem Tutorial gelesen haben, denn wenn ja, wissen Sie, dass WPF eine hervorragende Unterstützung für Sprachsynthese hat. Damit können wir die Schlange sehr leicht zum Reden bringen!
Zunächst müssen Sie Ihrem Projekt einen Verweis auf die Assembly System.Speech hinzufügen. Eine genaue Anleitung zum Hinzufügen genau dieser Assembly zu Ihrem Projekt finden Sie in diesem vorherigen Artikel: Sprachsynthese (WPF zum Reden bringen). Oben finden Sie eine detaillierte Anleitung, wie dies erreicht werden kann.
Ich habe beschlossen, die Schlange in mehreren Situationen zum Sprechen zu bringen. Daher erstelle ich eine gemeinsame SpeechSynthesizer -Instanz, die ich jedes Mal wiederverwende. Zunächst füge ich jedoch einen Verweis auf das Speech.Synthesis -System hinzu. (Namensraum oben)
using System.Speech.Synthesis;
Dann deklarieren und initialisieren Sie die Instanz oben in Ihrem Fenster:
public partial class MainWindow : Window
{
private SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
.......
"Yummy!"
Das ist alles, was wir brauchen, um die Schlange zum Reden zu bringen - aber wann soll sie reden und was soll sie sagen? Ich beschloss, es jedes Mal "lecker" zu machen, wenn sie einen Apfel isst. Dies geschieht in der zuvor implementierten EatSnakeFood() -Methode. Fügen Sie einfach eine einzelne Zeile oben hinzu:
private void EatSnakeFood()
{
speechSynthesizer.SpeakAsync("yummy");
......
Das war's - starte das Spiel und genieße das "Lecker" jedes Mal, wenn die Schlange einen Apfel isst. Natürlich kann die Textfolge auch in ein anderes Wort oder sogar einen Satz geändert werden, wenn Sie Lust dazu haben.
"Oh nein - du bist gestorben!"
"Lecker" zu sagen ist super einfach, wie Sie sehen können, aber der SpeechSynthesizer kann noch viel mehr! Um dies zu demonstrieren, habe ich mich entschlossen, die Schlange über ihren eigenen Tod und das Endergebnis des Spiels zu sprechen - mit anderen Worten, wir müssen der EndGame() -Methode ein paar Worte hinzufügen. Es wird einige zusätzliche Codezeilen geben, da ich mehrere Sätze mit unterschiedlichen Spracheinstellungen haben möchte. Daher habe ich beschlossen, den Code für das Ende des Spiels in einer eigenen Methode mit dem Namen SpeakEndOfGameInfo() zu kapseln. Der Aufruf erfolgt am Ende der EndGame() -Methode, die zuvor in diesem Lernprogramm implementiert wurde. Fügen Sie also den Aufruf am Ende der Methode hinzu:
private void EndGame()
{
.......
SpeakEndOfGameInfo(isNewHighscore);
}
So sieht unsere Implementierung aus:
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);
}
Das ist also ziemlich viel Code, aber wenn Sie genauer hinschauen, werden Sie feststellen, dass es oft dieselben Dinge gibt - wir verwenden im Grunde eine PromptBuilder -Instanz, um einen längeren Satz mit verschiedenen Ausspracheeinstellungen zu erstellen . Am Ende sagt die Schlange bei jedem Tod "Oh nein - du bist gestorben". Wenn Sie es in die Highscore-Liste geschafft haben, die in einem der vorherigen Artikel hinzugefügt wurde, wird "Neue Highscore:" hinzugefügt, gefolgt von der tatsächlichen Punktzahl.
Jeder Teil davon wird mit geeigneten Einstellungen gesprochen, wobei PromptStyle -Instanzen verwendet werden. Beispielsweise wird "oh nein - du bist gestorben" langsam und mit erhöhter Lautstärke gesprochen. Wir verwenden auch die AppendBreak() -Methode, um natürliche Brüche zwischen den verschiedenen Teilen hinzuzufügen. Weitere Informationen zu diesen Techniken finden Sie in unserem vorherigem Artikel zur Sprachsynthese.
Zusammenfassung
Dank der System.Speech -Baugruppe und der SpeechSynthesizer -Klasse hat unsere Schlange gerade das Sprechen gelernt! Dadurch macht das Spiel viel mehr Spaß und es wird demonstriert, wie cool, leistungsstark und flexibel das .NET-Framework ist.