Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework
- Название:Программирование КПК и смартфонов на .NET Compact Framework
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:978-5-91180-270-7
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Александр Климов - Программирование КПК и смартфонов на .NET Compact Framework краткое содержание
Мобильные устройства все активнее вторгаются в нашу жизнь. Карманные компьютеры и смартфоны давно утратили статус дорогих игрушек и перекочевали в разряд необходимых устройств. Значит, для них необходимо создавать программное обеспечение. Так почему вы должны оставаться в стороне?
Прочитав эту книгу, вы получите знания, которые позволят вам уверенно создавать программы для карманных компьютеров и смартфонов. А огромное количество разнообразных примеров поможет быстро совершенствоваться и развиваться, обогащая свой опыт работы.
Книга предназначена для начинающих программистов.
Программирование КПК и смартфонов на .NET Compact Framework - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Класс 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));
}
}
Метод Playпроверяет флаг переменной Enabled. С его помощью можно легко включать или выключать звук в игре. Воспроизведение звука обеспечивается вызовом функции Windows API WCE_PlaySoundBytes, что иллюстрирует код, приведенный в листинге 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
}
///
/// Функция Windows API для воспроизведения звука.
///
/// Массив байтов, содержащих данные ///
/// Дескриптор к модулю, содержащему звуковой
/// ресурс
/// Флаги для управления звуком
///
[DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
private extern static int WCE_PlaySoundBytes( byte[] szSound,
IntPtr hMod, int flags);
Теперь, когда создан экземпляр класса Sound, можно воспроизводить звук при столкновении сыра с батоном хлеба. Соответствующий код приведен в листинге 11.42.
// если сыр движется вниз
if (cheeseRectangle.IntersectsWith(breadRectangle)) {
// столкновение
// воспроизводим удар
batHitSound.Play();
}
Можете запустить проект, чтобы проверить работу звука. Также можно добавить звук при столкновении сыра с помидорами. Этот код приведен в листинге 11.43.
if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {
// воспроизводим звук столкновения сыра с помидором
tomatoHitSound.Play();
}
Дальнейшие улучшения
Но игру все еще можно улучшить. В следующем списке указаны дополнительные возможности, которые необходимо реализовать.
□ Режим «attract», включающийся, когда пользователь не играет.
□ Потеря жизни, если сыр ударился о нижнюю границу экрана.
□ При уничтожении всех томатов они должны появиться чуть ниже, и скорость игры должна возрасти.
□ Добавление в игру случайных элементов.
В программу надо ввести булеву переменную gameLive, которая имеет значение True, когда пользователь ведет игру. Если значение переменной равно False, то сыр будет двигаться по экрану, но никаких игровых действий производиться не будет.
Для этого потребуется изменить метод, выполняющийся при старте игры. Новая версия приведена в листинге 11.44.
///
/// True, если игра запущена на экране.
///
private bool gameLive = false;
///
/// Число оставшихся жизней.
///
private int livesLeft;
///
/// Число жизней, доступных для игрока.
///
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;
// Установим начальную скорость
xSpeed = 1;
ySpeed = 1;
// Установим флаг, позволяющий начать игру
gameLive = true;
}
Этот код возвращает все объекты на исходные позиции и начинает новую игру. Батон располагается в середине экрана, а сыр чуть выше него. Этот метод связан с пунктом меню, позволяющим начать игру.
Читать дальшеИнтервал:
Закладка: