Чтение онлайн

на главную - закладки

Жанры

Программирование КПК и смартфонов на .NET Compact Framework

Климов Александр Петрович

Шрифт:

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

// если сыр движется вниз

Поделиться:
Популярные книги

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Измена. Отбор для предателя

Лаврова Алиса
1. Отбор для предателя
Фантастика:
фэнтези
5.00
рейтинг книги
Измена. Отбор для предателя

Кодекс Крови. Книга II

Борзых М.
2. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга II

Шаг в бездну

Муравьёв Константин Николаевич
3. Перешагнуть пропасть
Фантастика:
фэнтези
космическая фантастика
7.89
рейтинг книги
Шаг в бездну

Часовая битва

Щерба Наталья Васильевна
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Часовая битва

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Хроники странного королевства. Вторжение. (Дилогия)

Панкеева Оксана Петровна
110. В одном томе
Фантастика:
фэнтези
9.38
рейтинг книги
Хроники странного королевства. Вторжение. (Дилогия)

Часовой ключ

Щерба Наталья Васильевна
1. Часодеи
Фантастика:
фэнтези
9.36
рейтинг книги
Часовой ключ

Инвестиго, из медика в маги

Рэд Илья
1. Инвестиго
Фантастика:
фэнтези
городское фэнтези
попаданцы
5.00
рейтинг книги
Инвестиго, из медика в маги

Кротовский, может, хватит?

Парсиев Дмитрий
3. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
аниме
7.50
рейтинг книги
Кротовский, может, хватит?

Драконий подарок

Суббота Светлана
1. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
7.30
рейтинг книги
Драконий подарок

Очешуеть! Я - жена дракона?!

Амеличева Елена
Фантастика:
юмористическая фантастика
5.43
рейтинг книги
Очешуеть! Я - жена дракона?!

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9