Книга: Программирование КПК и смартфонов на .NET Compact Framework
Звуковые эффекты
Разделы на этой странице:
Звуковые эффекты
Неплохо бы добавить в игру звуковые эффекты. К сожалению, библиотека .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.
Листинг 11.36
using System.Runtime.InteropServices;
using System.IO;
Наш пример со звуком просто хранит в памяти байтовый массив с аудиоматериалом. Для обращения к этому блоку используется функция операционной системы, способная производить звуки. В классе Sound
блок памяти объявляется так, как показано в листинге 11.37.
Листинг 11.37
/// <summary>
/// массив байтов, содержащий данные о звуке
/// </summary>
private byte[] soundBytes;
Эта конструкция не создает массив, а только объявляет его. Массив будет создан при конструировании экземпляра класса, ведь изначально размер звукового файла неизвестен.
Код конструктора приведен в листинге 11.38.
Листинг 11.38
/// <summary>
/// Создание экземпляра sound и хранение данных о звуке
/// </summary>
/// <param name="soundStream">поток для чтения звука</param>
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.
Листинг 11.39
/// <summary>
/// Звук, воспроизводимый при столкновении с батоном хлеба
/// </summary>
private Sound batHitSound;
/// <summary>
/// Звук, воспроизводимый при столкновении с помидором
/// </summary>
private Sound tomatoHitSound;
// Получим звук при столкновении с батоном хлеба
batHitSound = new Sound
(execAssem.GetManifestResourceStream(@"Bouncer.click.wav"));
// Получим звук при столкновении с помидором
tomatoHitSound = new Sound
(execAssem.GetManifestResourceStream(@"Bouncer.burp.wav"));
Для воспроизведения звука в класс Sound
надо добавить метод Play
, как показано в листинге 11.40.
Листинг 11.40
/// <summary>
/// Управление звуком в игре (Включать или выключать)
/// </summary>
public static bool Enabled = true;
/// <summary>
/// Проигрываем звук
/// </summary>
public void Play() {
if (Sound.Enabled) {
WCE_PlaySoundBytes(soundBytes, IntPtr.Zero,
(int)(Flags.SND_ASYNC | Flags.SND_MEMORY));
}
}
Метод Play
проверяет флаг переменной Enabled
. С его помощью можно легко включать или выключать звук в игре. Воспроизведение звука обеспечивается вызовом функции Windows API WCE_PlaySoundBytes
, что иллюстрирует код, приведенный в листинге 11.41.
Листинг 11.41
private enum Flags {
SND_SYNC = 0x0000,
SND_ASYNC = 0x0001,
SND_NODEFAULT = 0x0002,
SND_MEMORY = 0x0004,
SND_LOOP = 0x0008,
SND_NOSTOP = 0x0010,
SND_NOWAIT = 0x00002000,
SND_ALIAS = 0x00010000,
SND_ALIASID = 0x00110000,
SND_FILENAME = 0x00020000,
SND_RESOURCE = 0x00040004
}
/// <summary>
/// Функция Windows API для воспроизведения звука.
/// </summary>
/// <param name="szSound">Массив байтов, содержащих данные /// </param>
/// <param name="hMod">Дескриптор к модулю, содержащему звуковой
/// ресурс</param>
/// <param name="flags">Флаги для управления звуком</param>
/// <returns></returns>
[DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
private extern static int WCE_PlaySoundBytes( byte[] szSound,
IntPtr hMod, int flags);
Теперь, когда создан экземпляр класса Sound
, можно воспроизводить звук при столкновении сыра с батоном хлеба. Соответствующий код приведен в листинге 11.42.
Листинг 11.42
// если сыр движется вниз
if (cheeseRectangle.IntersectsWith(breadRectangle)) {
// столкновение
// воспроизводим удар
batHitSound.Play();
}
Можете запустить проект, чтобы проверить работу звука. Также можно добавить звук при столкновении сыра с помидорами. Этот код приведен в листинге 11.43.
Листинг 11.43
if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {
// воспроизводим звук столкновения сыра с помидором
tomatoHitSound.Play();
}
- Начало работы
- Добавление изображения в программу
- Использование встроенных ресурсов
- Вывод картинки на экран
- Создание анимации
- Отражения
- Управление скоростью движения объекта
- Добавляем новый объект
- Устранение мерцания
- Хлеб — всему голова
- Обнаружение столкновений
- Столкновения батона и мяча
- Новые объекты
- Размещение помидоров
- Уничтожение томатов
- Счет игры
- Ведение счета
- Звуковые эффекты
- Дальнейшие улучшения
- И опять добавляем новые объекты
- Управление таблицей результатов
- Переключение между формами
- Отображение дочернего окна
- Получение имени игрока
- Хранение лучших результатов
- Улучшение графики
- Спрайты
- Звуковые сигналы BIOS
- Почему в ноутбуке пропали системные звуки? При этом звуковые файлы воспроизводятся только в Winamp. Переустанавливал дра...
- Эффекты переключения между окнами
- 19.5.1. Простые эффекты
- Excel. Трюки и эффекты
- ГЛАВА 10 Визуальные эффекты
- Глава 3. Побочные эффекты: как разобраться с убийцами креативности
- Побочные эффекты
- Звуковые и текстовые сигналы PhoenixBIOS
- Цифровая фотография. Трюки и эффекты
- Дополнительные эффекты с использованием прозрачных изображений
- Динамические эффекты строк и столбцов