За каждый уничтоженный томат начисляется 10 очков. Эти данные постоянно обновляются и выводятся на экран.
Звуковые эффекты
Неплохо бы добавить в игру звуковые эффекты. К сожалению, библиотека .NET Compact Framework пока не поддерживает воспроизведение звуковых файлов при помощи управляемого кода. Поэтому придется воспользоваться механизмом Platform Invoke (P/Invoke). В главе, посвященной вызовам функций Windows API, эта тема будет освещаться подробнее
Для воспроизведения звуков можно встроить звуковой файл в саму программу, как это делалось с изображениями, либо проигрывать сам звуковой файл, который расположен где-то в файловой системе.
В этом проекте требуется создать отдельный класс для воспроизведения звуков. Нужно щелкнуть правой кнопкой мыши на проекте Bouncer
в окне Solution Explorer
и выполнить команду контекстного меню Add►New Item...
В открывшемся окне нужно выбрать элемент Class
и задать имя Sound.cs
. После нажатия кнопки Add
новый класс будет добавлен в проект.
Класс Sound
будет иметь два метода. Один метод создает экземпляр класса Sound
, читая данные из заданного файла. Второй метод предназначен для проигрывания звука. Также в составе класса будет находиться свойство, позволяющее настраивать громкость звука.
В начале файла Sound.cs
надо расположить строки для подключения используемых пространств имен, как показано в листинге 11.36.
using System.Runtime.InteropServices;
using System.IO;
Наш пример со звуком просто хранит в памяти байтовый массив с аудиоматериалом. Для обращения к этому блоку используется функция операционной системы, способная производить звуки. В классе Sound
блок памяти объявляется так, как показано в листинге 11.37.
///
/// массив байтов, содержащий данные о звуке
///
private byte[] soundBytes;
Эта конструкция не создает массив, а только объявляет его. Массив будет создан при конструировании экземпляра класса, ведь изначально размер звукового файла неизвестен.
Код конструктора приведен в листинге 11.38.
///
/// Создание экземпляра sound и хранение данных о звуке
///
/// поток для чтения звука
public Sound(Stream soundStream) {
// создаем массив байтов для приема данных
soundBytes = new byte[soundStream.Length];
// читаем данные из потока
soundStream.Read(soundBytes, 0, (int)soundStream.Length);
}
Поток связывается с файлом или другим источником данных. Он имеет свойство Length
, определяющее размер массива. Метод Read
применяется для получения информации, после чего прочитанные байты сохраняются в массиве. Звуковые файлы хранятся в виде ресурсов, как и изображения.
В проект надо добавить звуковые файлы click.wav
и burp.wav
и для их свойства Build Action
задать значение Embedded Resources
. Теперь доступ к звуковым файлам получить очень просто, что иллюстрирует код, приведенный в листинге 11.39.
///
/// Звук, воспроизводимый при столкновении с батоном хлеба
///
private Sound batHitSound;
///
/// Звук, воспроизводимый при столкновении с помидором
///
private Sound tomatoHitSound;
// Получим звук при столкновении с батоном хлеба
batHitSound = new Sound
(execAssem.GetManifestResourceStream(@"Bouncer.click.wav"));
// Получим звук при столкновении с помидором
tomatoHitSound = new Sound
(execAssem.GetManifestResourceStream(@"Bouncer.burp.wav"));
Для воспроизведения звука в класс Sound
надо добавить метод Play
, как показано в листинге 11.40.
///
/// Управление звуком в игре (Включать или выключать)
///
public static bool Enabled = true;
///
/// Проигрываем звук
///
public void Play() {
if (Sound.Enabled) {
WCE_PlaySoundBytes(soundBytes, IntPtr.Zero,
(int)(Flags.SND_ASYNC | Flags.SND_MEMORY));
}
}