TOC

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

Criando um jogo: 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

A maioria dos jogos terá efeitos sonoros para aprimorar a experiência, mas até agora, nossa implementação de pequena cobra está completamente silenciosa. Anteriormente, falamos sobre áudio e vídeo neste tutorial; portanto, se você leu esses artigos, sabe que tocar um som com o WPF é bastante fácil. Na verdade, se você consegue conviver com os sons do sistema, isso pode ser feito com uma única linha de código:

SystemSounds.Beep.Play();

Se precisar de um pouco mais do que isso, você pode usar a classe MediaPlayer para reproduzir seus próprios arquivos de áudio (por exemplo MP3). Você pode ler tudo sobre isso neste artigo: Reproduzindo áudio com o WPF. Um projeto pequeno e divertido poderia ser gravar o som de você dando uma mordida em uma maçã e, em seguida, tocando quando a cobra come uma maçã - é relativamente fácil de realizar!

Fazendo a Snake falar

Para este tutorial, decidi ir por outro caminho além de apenas tocar frases de efeito normais - quero que a Cobra fale! Isso pode parecer difícil, mas somente se você não leu todos os artigos deste tutorial, porque se tiver, você sabe que o WPF tem um ótimo suporte para Síntese de voz. Com isso, podemos fazer a cobra falar muito facilmente!

Primeiro de tudo, você precisa adicionar uma referência ao assembly System.Speech ao seu projeto. Para obter instruções específicas sobre como adicionar exatamente este conjunto ao seu projeto, consulte este artigo anterior: Síntese de voz (fazendo WPF falar). No topo, você encontrará um guia detalhado de como fazer isso.

Eu decidi fazer a Snake (cobra) falar em várias situações, pois então decidi criar uma instância comum SpeechSynthesizer que irei reutilizar todas as vezes, mas antes adiciono o namespace System.Speech.Synthesis que faz referência e ela:

using System.Speech.Synthesis;

Em seguida, declare e inicialize a instância na parte superior de sua janela:

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

"Delícia!"

Isso é tudo de que precisamos para fazer a Cobra falar - mas quando ela deveria falar e o que deveria dizer? Decidi dizer "gostoso" cada vez que ele come uma maçã. Isso acontece no método EatSnakeFood() que implementamos anteriormente, portanto, basta adicionar uma única linha no topo dele:

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

É isso - execute o jogo e aproveite o "yummy" cada vez que a cobra comer uma maçã. É claro que a string de texto pode ser alterada para outra palavra ou mesmo uma frase, se você desejar.

"Ah não - você morreu!"

Dizer "yummy" é super simples, como você pode ver, mas o SpeechSynthesizer pode fazer muito mais do que isso! Para demonstrar isso, decidi fazer o Snake falar sobre sua própria morte e o resultado final do jogo - em outras palavras, precisamos adicionar um pouco de conversa ao método EndGame(). Haverá algumas linhas de código extra, porque eu quero várias frases com configurações de fala diferentes, então decidi encapsular o código de conversa no final do jogo em seu próprio método chamado SpeakEndOfGameInfo(). Ele é chamado na parte inferior do método EndGame(), implementado anteriormente neste tutorial, portanto, basta adicionar a chamada na parte inferior do método:

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

Veja como fica nossa implementação :

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

Portanto, isso é um pouco de código, mas se você olhar mais de perto, verá que existem muitas coisas - basicamente usamos uma instância PromptBuilder para criar uma frase mais longa, com várias configurações de pronúncia . No final, isso fará com que a Cobra diga "Oh no - you died" cada vez que você morrer. Se você entrou na lista de pontuação máxima, adicionada em um dos artigos anteriores, será adicionado "New high score:", seguido pela pontuação real.

Cada parte disso é falada com as configurações adequadas, usando instâncias do PromptStyle - por exemplo, "oh no - you died" é falado lentamente, com um volume aumentado. Também usamos o método AppendBreak() para adicionar quebras naturais entre as diferentes partes. Você pode ler mais sobre essas técnicas em nosso artigo anterior sobre a síntese de fala.

Resumo

Obrigado a referência System.Speech e a classe SpeechSynthesizer, nossa Snake acabou de aprender a falar! Isso faz do nosso jogo muito mais divertido, demostrando como é legal, poderoso e flexível a estrutura do .Net


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!