- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование КПК и смартфонов на .NET Compact Framework - Александр Климов
Шрифт:
Интервал:
Закладка:
/// Счет в игре
/// </summary>
private int scoreValue = 0;
private void updatePositions() {
if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {
// прячем томат
tomatoes[i].visible = false;
// отражаемся вниз
goingDown = true;
// обновляем счет
scoreValue = scoreValue + 10;
messageString = "Счет: " + scoreValue;
break;
}
}
За каждый уничтоженный томат начисляется 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.
Листинг 11.36using 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.41private 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.43if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {
// воспроизводим звук столкновения сыра с помидором
tomatoHitSound.Play();
}
Дальнейшие улучшения
Но игру все еще можно улучшить. В следующем списке указаны дополнительные возможности, которые необходимо реализовать.
□ Режим «attract», включающийся, когда пользователь не играет.
□ Потеря жизни, если сыр ударился о нижнюю границу экрана.
□ При уничтожении всех томатов они должны появиться чуть ниже, и скорость игры должна возрасти.
□ Добавление в игру случайных элементов.
В программу надо ввести булеву переменную gameLive, которая имеет значение True, когда пользователь ведет игру. Если значение переменной равно False, то сыр будет двигаться по экрану, но никаких игровых действий производиться не будет.
Для этого потребуется изменить метод, выполняющийся при старте игры. Новая версия приведена в листинге 11.44.
Листинг 11.44/// <summary>
/// True, если игра запущена на экране.
/// </summary>
private bool gameLive = false;
/// <summary>
/// Число оставшихся жизней.
/// </summary>
private int livesLeft;
/// <summary>
/// Число жизней, доступных для игрока.
/// </summary>
private int startLives = 3;
private void startGame() {
// Устанавливаем число жизней, счет и сообщения
livesLeft = startLives;
scoreValue = 0;
messageString = "Счет: 0 Жизнь: " + livesLeft;
// Располагаем помидоры наверху экрана
tomatoDrawHeight = tomatoLevelStartHeight;
placeTomatoes();
// Поместим батон в центре экрана
breadRectangle.X = (this.ClientSize.Width - breadRectangle.Width) / 2;
breadRectangle.Y = this.ClientSize.Height / 2;
// Поместим сыр над батоном в центре экрана
cheeseRectangle.X = (this.ClientSize.Width - cheeseRectanglе.Width) / 2;
cheeseRectangle.Y = breadRectangle.Y — cheeseRectangle.Height;
// Установим начальную скорость

