TOC

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

Creando un juego: 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 mayoría de los juegos tendrán efectos de sonido para mejorar la experiencia, pero hasta ahora, nuestra pequeña implementación de serpiente es completamente silenciosa. Anteriormente hemos hablado sobre audio y vídeo en este tutorial, por lo que si ha leído estos artículos, sabrá que reproducir un sonido con WPF es bastante fácil. De hecho, si puede vivir con los sonidos del sistema, puede hacerlo con una sola línea de código:

SystemSounds.Beep.Play();

Si necesita un poco más que eso, puede usar la clase MediaPlayer para reproducir sus propios archivos de audio (por ejemplo, MP3). Puede leer todo al respecto en este artículo: Reproducción de audio con WPF . Un pequeño proyecto divertido podría ser grabar el sonido de ti mordiendo una manzana y luego tocarla cuando la serpiente se come una manzana, ¡es bastante fácil de lograr!

Hacer hablar a la serpiente

Para este tutorial, decidí ir por otro camino que no sea simplemente tocar fragmentos de sonido regulares: ¡quiero que Snake hable! Esto puede sonar difícil, pero solo si no ha leído todos los artículos de este tutorial, porque si lo ha hecho, sabe que WPF tiene un gran soporte para Speech synthesis. ¡Con esto, podemos hacer que la serpiente hable muy fácilmente!

En primer lugar, debe agregar una referencia al ensamblaje System.Speech a su proyecto. Para obtener instrucciones específicas sobre cómo agregar exactamente este ensamblaje a su proyecto, consulte este artículo anterior: Speech synthesis (making WPF talk). En la parte superior, encontrará un recorrido detallado sobre cómo lograr esto.

He decidido hacer que la Serpiente hable en varias situaciones, por lo que crearé una instancia SpeechSynthesizer común que reutilizaré cada vez, pero comenzaré agregando una referencia al sistema . Speech.Synthesis espacio de nombres en la parte superior:

using System.Speech.Synthesis;

Luego declara e inicializa la instancia en la parte superior de tu ventana:

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

"¡Delicioso!"

Eso es todo lo que necesitamos para que la serpiente hable, pero ¿cuándo debería hablar y qué debería decir? Decidí hacer que dijera "delicioso" cada vez que come una manzana. Esto sucede en el método EatSnakeFood () que implementamos anteriormente, así que solo agregue una línea en la parte superior:

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

Eso es todo: ejecuta el juego y disfruta del "delicioso" cada vez que la serpiente come una manzana. Por supuesto, la cadena de texto se puede cambiar a otra palabra o incluso una oración, si lo desea.

"Oh no - has muerto!"

Decir "delicioso" es súper simple, como puedes ver, ¡pero el SpeechSynthesizer puede hacer mucho más que eso! Para demostrarlo, he decidido hacer que la Serpiente hable sobre su propia muerte y la puntuación final del juego; en otras palabras, necesitamos agregar algunas charlas al método EndGame () . Habrá bastantes líneas de código extra, porque quiero varias oraciones con diferentes configuraciones de voz, así que he decidido encapsular el código de conversación al final del juego en su propio método llamado SpeakEndOfGameInfo () . Se llama en la parte inferior del método EndGame () , implementado previamente en este tutorial, así que solo agregue la llamada en la parte inferior del método:

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

Así es como se ve nuestra implementación:

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);  
}

Eso es bastante código, pero si miras más de cerca, verás que hay muchas de las mismas cosas: básicamente utilizamos una instancia de PromptBuilder para crear una oración más larga, con varias configuraciones de pronunciación . Al final, esto hará que la Serpiente diga "Oh no, moriste" cada vez que mueras. Si ingresó en la lista de puntuación alta, agregada en uno de los artículos anteriores, agregará "Nueva puntuación alta:", seguido de la puntuación real.

Cada parte de esto se habla con la configuración adecuada, utilizando instancias PromptStyle , por ejemplo, "oh no, moriste" se habla lentamente, con un volumen aumentado. También utilizamos el método AppendBreak () para agregar pausas naturales entre las diferentes partes. Puede leer más sobre estas técnicas en nuestro previous article on the speech synthesis.

Resumen

Gracias al ensamblaje System.Speech y la clase SpeechSynthesizer , ¡nuestra serpiente acaba de aprender a hablar! Esto hace que el juego sea mucho más divertido, al tiempo que demuestra lo genial, poderoso y flexible que es .NET Framework.

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!