This article has been localized into Vietnamese 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!
Cải thiện SnakeWPF: Thêm âm thanh
Hầu hết các trò chơi sẽ có hiệu ứng âm thanh để nâng cao trải nghiệm, nhưng cho đến nay, việc thực hiện con rắn nhỏ của chúng tôi hoàn toàn yên tĩnh. Trước đây chúng ta đã nói về cả âm thanh và video trong hướng dẫn này, vì vậy nếu bạn đã đọc những bài viết này, bạn sẽ biết rằng việc phát âm thanh với WPF khá dễ dàng. Trong thực tế, nếu bạn có thể sống với âm thanh hệ thống, nó có thể được thực hiện với một dòng mã:
SystemSounds.Beep.Play();
Nếu bạn cần nhiều hơn thế, bạn có thể sử dụng lớp MediaPlayer để phát các tệp âm thanh của riêng bạn (ví dụ MP3). Bạn có thể đọc tất cả về nó trong bài viết này: Phát âm thanh với WPF. Một dự án nhỏ thú vị có thể là ghi lại âm thanh bạn cắn một miếng táo và sau đó chơi nó khi con rắn ăn một quả táo - thật dễ dàng để thực hiện!
Làm cho Rắn nói
Đối với hướng dẫn này, tôi quyết định đi một con đường khác hơn là chỉ chơi những âm thanh thông thường - tôi muốn Rắn nói chuyện! Điều này nghe có vẻ khó khăn, nhưng chỉ khi bạn chưa đọc tất cả các bài viết trong hướng dẫn này, bởi vì nếu bạn có, bạn biết rằng WPF có sự hỗ trợ tuyệt vời cho việc Speech synthesis. Với điều này, chúng ta có thể làm cho con rắn nói chuyện rất dễ dàng!
Trước hết, bạn cần thêm một tham chiếu đến cụm System.Speech vào dự án của bạn. Để biết hướng dẫn cụ thể về việc thêm chính xác lắp ráp này vào dự án của bạn, vui lòng xem bài viết trước: Speech synthesis (making WPF talk). Ở phía trên, bạn sẽ tìm thấy hướng dẫn chi tiết về cách thực hiện việc này.
Tôi đã quyết định làm cho Snake nói chuyện trong một số tình huống, vì vậy tôi sẽ tạo một cá thể SpeechSynthesizer chung mà tôi sẽ sử dụng lại mỗi lần, nhưng bắt đầu bằng cách thêm một tham chiếu đến không gian tên System.Speech.Synthesis tổng hợp ở trên cùng:
using System.Speech.Synthesis;
Sau đó khai báo và khởi tạo thể hiện ở đầu Window của bạn:
public partial class MainWindow : Window
{
private SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
.......
"Yummy!"
Đó là tất cả những gì chúng ta cần để làm cho Snake nói chuyện - nhưng khi nào nó nên nói và nó nên nói gì? Tôi quyết định làm cho nó nói "yummy" mỗi khi nó ăn một quả táo. Điều này xảy ra trong phương thức EatSnakeFood() mà chúng ta đã triển khai trước đó, vì vậy chỉ cần thêm một dòng duy nhất vào đầu của nó:
private void EatSnakeFood()
{
speechSynthesizer.SpeakAsync("yummy");
......
That's it - chạy trò chơi và tận hưởng âm thanh "yummy" mỗi khi con rắn ăn một quả táo. Tất nhiên, chuỗi văn bản có thể được thay đổi thành một từ khác hoặc thậm chí là một câu, nếu bạn cảm thấy thích nó.
"Oh no - you died!"
Nói "yummy" là siêu đơn giản, như bạn có thể thấy, nhưng SpeechSynthesizer có thể làm được nhiều hơn thế! Để chứng minh điều đó, tôi đã quyết định làm cho Snake nói về cái chết của chính nó và điểm số cuối cùng của trò chơi - nói cách khác, chúng ta cần thêm một số cuộc nói chuyện vào phương thức EndGame(). Sẽ có khá nhiều dòng code bổ sung, vì tôi muốn một vài câu với các cài đặt giọng nói khác nhau, vì vậy tôi đã quyết định gói gọn mã kết thúc trò chơi trong phương thức riêng của mình có tên là SpeakEndOfGameInfo(). Nó được gọi ở dưới cùng của phương thứcEndGame(), được triển khai trước đó trong hướng dẫn này, vì vậy chỉ cần thêm lệnh gọi ở dưới cùng của phương thức:
private void EndGame()
{
.......
SpeakEndOfGameInfo(isNewHighscore);
}
Đây là cách chúng tôi thực hiện 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);
}
Vì vậy, đó là một chút code, nhưng nếu bạn nhìn kỹ hơn, bạn sẽ thấy rằng có rất nhiều nội dung giống nhau - về cơ bản chúng tôi sử dụng một ví dụ PromptBuilder để tạo một câu dài hơn, với nhiều cài đặt phát âm khác nhau. Cuối cùng, điều này sẽ khiến Rắn nói "Oh no - you died" mỗi khi bạn chết. Nếu bạn đưa nó vào danh sách điểm cao, được thêm vào một trong những bài viết trước, nó sẽ thêm "New high score:", tiếp theo là điểm thực tế.
Mỗi phần của điều này được nói với các cài đặt phù hợp, sử dụng các trường hợp PromptStyle - ví dụ: "oh no - you died" được nói chậm, với âm lượng tăng. Chúng tôi cũng sử dụng phương thức AppendBreak() để thêm các ngắt tự nhiên giữa các phần khác nhau. Bạn có thể đọc thêm về các kỹ thuật này trong bài viết trước của chúng tôi về speech synthesis.
Tổng kết
Nhờ cóSystem.Speech và lớp SpeechSynthesizer, Snake của chúng ta vừa học cách nói chuyện! Điều này làm cho trò chơi thú vị hơn rất nhiều, đồng thời chứng minh .NET framework tuyệt vời, mạnh mẽ và linh hoạt như thế nào.