TOC

This article has been localized into Ukrainian by the community.

Створення гри: 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!

Покращення SnakeWPF: додавання звуку

Більшість ігор мають звукові ефекти для покращення ігрового процесу, але поки що наша реалізація у вигляді маленької змійки абсолютно тиха. Раніше ми вже говорили про аудіо та відео в цьому посібнику, тому, якщо ви читали ці статті, ви знаєте, що відтворити звук за допомогою WPF досить просто. Насправді, якщо ви можете змиритися із системними звуками, це можна зробити за допомогою одного рядка коду:

SystemSounds.Beep.Play();

Якщо вам потрібно трохи більше, ви можете скористатися класом MediaPlayer для відтворення власних аудіофайлів (наприклад, MP3). Ви можете прочитати все про це в цій статті: Відтворення аудіо за допомогою WPF. Цікавим невеликим проектом може бути запис звуку, коли ви кусаєте яблуко, а потім відтворення його, коли змія їсть яблуко – це досить легко зробити!

Змусити Змію говорити

Для цього посібника я вирішив піти іншим шляхом, ніж просто відтворювати звичайні звукові фрагменти — я хочу, щоб Змія говорила! Це може здатися складним, але лише якщо ви не прочитали всі статті в цьому посібнику, бо якщо читали, то знаєте, що WPF має чудову підтримку для синтезу мовлення. Завдяки цьому ми можемо дуже легко змусити змію говорити!

Перш за все, вам потрібно додати посилання на збірку System.Speech до вашого проекту. Для отримання конкретних інструкцій щодо додавання саме цієї збірки до вашого проекту, будь ласка, перегляньте попередню статтю: Синтез мовлення (змусити WPF розмовляти). У верхній частині ви знайдете детальний покроковий посібник, як це зробити.

Я вирішив зробити так, щоб Змія розмовляла в кількох ситуаціях, тому я створю загальний екземпляр SpeechSynthesizer, який я використовуватиму повторно щоразу, але почну з додавання посилання на простір імен System.Speech.Synthesis у верхній частині:

using System.Speech.Synthesis;

Потім оголосіть та ініціалізуйте екземпляр у верхній частині вашого вікна:

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

"Смакота!"

Це все, що нам потрібно, щоб Змія заговорила, але коли вона повинна говорити і що вона повинна казати? Я вирішив зробити так, щоб вона казала «смакота» щоразу, коли їсть яблуко. Це відбувається в методі EatSnakeFood(), який ми реалізували раніше, тому просто додайте один рядок у його початок:

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

Ось і все – запускайте гру та насолоджуйтесь «смакотою» щоразу, коли змія з'їдає яблуко. Звичайно, текстовий рядок можна змінити на інше слово або навіть речення, якщо забажаєте.

«О ні — ти помер!»

Сказати «смакота» надзвичайно просто, як бачите, але SpeechSynthesizer може набагато більше! Щоб продемонструвати це, я вирішив змусити Змію говорити про власну смерть та остаточний рахунок гри – іншими словами, нам потрібно додати трохи розмови до методу EndGame(). Буде чимало додаткових рядків коду, оскільки мені потрібно кілька речень з різними налаштуваннями мовлення, тому я вирішив інкапсулювати код розмови про кінець гри в окремий метод під назвою SpeakEndOfGameInfo(). Він викликається внизу методу EndGame(), реалізованого раніше в цьому посібнику, тому просто додайте виклик внизу методу:

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

Ось як виглядає наша реалізація цього:

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

Отже, це досить багато коду, але якщо придивитися уважніше, то можна побачити, що тут багато однакового – ми, по суті, використовуємо екземпляр PromptBuilder для створення довшого речення з різними налаштуваннями вимови. Зрештою, це змусить Змію щоразу, коли ви помрете, говорити «О ні – ви померли». Якщо ви потрапили до списку найкращих результатів, доданого в одній з попередніх статей, буде додано «Новий найкращий результат:», а потім фактичний результат.

Кожна частина цього вимовляється з відповідними налаштуваннями, використовуючи екземпляри PromptStyle – наприклад, «oh no – you death» вимовляється повільно, зі збільшеною гучністю. Ми також використовуємо метод AppendBreak(), щоб додати природні розриви між різними частинами. Ви можете дізнатися більше про ці методи в нашій попередній статті про синтез мовлення.

Короткий зміст

Завдяки збірці System.Speech та класу SpeechSynthesizer наша Змія щойно навчилася говорити! Це робить гру набагато цікавішою, водночас демонструючи, наскільки крутим, потужним та гнучким є .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!