- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование КПК и смартфонов на .NET Compact Framework - Александр Климов
Шрифт:
Интервал:
Закладка:
/// <summary>
/// Папка, в которой находится программа.
/// Используется как место для хранения настроек игры.
/// </summary>
private string applicationDirectory;
// Получим имя файла программы из текущей сборки
string appFilePath =
execAssem.GetModules()[0].FullyQualifiedName;
// Выделяем из полного пути имени файла только путь к файлу
applicationDirectory =
System.IO.Path.GetDirectoryName(appFilePath);
// Обязательно должен быть разделитель в конце пути
if (!applicationDirectory.EndsWith(@"")) {
applicationDirectory += @"";
}
С помощью данного кода можно получить ссылку на первый модуль в программной сборке. Затем с помощью свойства FullyQualifiedName можно получить полный путь к файлу программы. Текущий каталог можно получить с помощью свойства GetDirectoryName. Также нам нужно быть уверенным, что путь к файлу заканчивается обратным слэшем. Небольшой код с проверкой решит эту проблему. Метод сохранения информации очень прост. Он приведен в листинге 11.63.
Листинг 11.63/// <summary>
/// Имя файла для хранения лучших результатов.
/// </summary>
private string highScoreFile = "highscore.bin";
/// <summary>
/// Сохраняем лучший результат в файле.
/// </summary>
public void SaveHighScore() {
System.IO.TextWriter writer = null;
try {
writer = new System.IO.StreamWriter(
applicationDirectory + highScoreFile);
writer.WriteLine(highScorePlayer);
writer.WriteLine(highScoreValue);
} catch {}
finally {
if (writer != null) {
writer.Close();
}
}
}
Метод сохранения результата в файле вызывается при выходе из программы. Загрузка лучших результатов выполняется при старте программы с помощью метода LoadHighScore, код которого приведен в листинге 11.64.
Листинг 11.64/// <summary>
/// Загружаем лучший результат из файла.
/// </summary>
public void LoadHighScore() {
System.IO.TextReader reader = null;
try {
reader = new System.IO.StreamReader(applicationDirectory + highScoreFile);
highScorePlayer = reader.ReadLine();
string highScoreString = reader.ReadLine();
highScoreValue = int.Parse(highScoreString);
} catch {}
finally {
if (reader != null) {
reader.Close();
}
}
}
Улучшение графики
На данный момент игра достаточно увлекательна, но графика оставляет желать лучшего. Когда объекты проходят друг через друга, можно увидеть ограничивающие прямоугольники объекта. Надо исправить эту ситуацию.
Для решения проблемы можно использовать прозрачность. Принцип работы с прозрачностью очень прост. Надо выбрать один или несколько цветов, после чего остается указать, что они объявляются прозрачными. В этом случае прозрачные пикселы не участвуют в отображении картинок.
Когда картинка рисуется без прозрачных цветов, она просто копируется в память. Применение прозрачных цветов заставляет машину проверять каждый пиксел для перерисовки, что увеличивает нагрузку на процессор. В полной версии библиотеки .NET Framework разработчик может несколько цветов делать прозрачными. В библиотеке .NET Compact Framework это можно сделать с одним цветом.
Использование прозрачности реализуется при помощи класса ImageAttributes пространства имен System.Drawing. Нужно создать новую переменную transparentWhite, так как белый цвет в изображениях будет считаться прозрачным. Экземпляр класса создается при старте программы, как показано в листинге 11.65.
Листинг 11.65/// <summary>
/// Маска для белого цвета, который будет считаться прозрачным
/// </summary>
private System.Drawing.Imaging.ImageAttributes transparentWhite;
// Задаем белую маску.
transparentWhite = new System.Drawing.Imaging.ImageAttributes();
transparentWhite.SetColorKey(Color.White, Color.White);
Напомню, что в .NET Framework метод SetColorKey принимает ряд цветов, а в .NET Compact Framework один и тот же цвет дается дважды. Этот цвет будет прозрачным для всех картинок, отображаемых с помощью класса ImageAttribute. Если в игре понадобятся белые цвета, то они не должны быть совершенно белыми.
Объекты игры были созданы так, чтобы их фон был абсолютно белым. Значения атрибутов, используемых при рисовании кусочка сыра, реализованы так, как показано в листинге 11.66. Для других объектов код будет абсолютно таким же.
Листинг 11.66// Выводим на экран кусочек сыра
g.DrawImage(
cheeseImage, // Image
cheeseRectangle, // Dest.rect
0, // srcX
0, // srcY
cheeseRectangle.Width, // srcWidth
cheeseRectangle.Height, // srcHeight
GraphicsUnit.Pixel, // srcUnit
transparentWhite); // ImageAttributes
В ранней версии игры вызывалась другая версия метода DrawImage. Теперь же задается прямоугольник и указывается прозрачный цвет. Чтобы прозрачность работала должным образом, сыр должен рисоваться на экране после отображения батона.
Итак, мы рисуем прозрачные области для батона, куска сыра и ветчины. Мы обошли вниманием помидоры, которые пока не перекрываются. Этот недостаток будет исправлен чуть позже. В качестве украшения надо добавить фоновую картинку в виде красочной скатерти (рис. 11.8).
Рис. 11.8. Фон для игры
Картинка должна иметь размер клиентской части экрана с белым пространством в верхней части для ведения счета.
Добавить фон не так уж и трудно. Вместо заливки экрана белым цветом в каждом кадре надо просто отрисовать этот узор. Следует объявить новую переменную backgroundImage для картинки-фона, загрузить изображение из ресурсов и изменить код в методе Form1_Paint, как показано в листинге 11.67.
Листинг 11.67/// <summary>
/// Изображение, содержащее фон игры.
/// </summary>
private Image backgroundImage = null;
// Получим изображение фона игры
backgroundImage = new System.Drawing.Bitmap(
execAssem.GetManifestResourceStream(@"Bouncer.tablecloth.gif"));
g.DrawImage(backgroundImage, 0, 0);
Код загружает картинку как ресурс. Программа теперь может использовать прозрачность для отображения томатов.
Программа неплохо работает в эмуляторе, но не очень хорошо на настоящем КПК, так как процесс рисования все еще имеет некоторые недочеты. Для их устранения следует применять спрайты.
Спрайты
Предыдущие версии программы выводили на экран каждое имеющееся изображение не самым лучшим образом. Скатерть, помидоры, хлеб, сыр и ветчина постоянно перерисовываются при обновлении экрана. Однако проще использовать экран в виде ряда слоев, как показано на рис. 11.9.
Рис. 11.9. Структура экрана
Нижний слой — это фоновая картинка. Этот слой рисуется один раз в начале загрузки программы. Библиотека спрайтов содержит класс Background для работы с фоном.
Средний слой — это спрайты, которые неподвижны. Их не нужно постоянно перерисовывать. Они меняют свое состояние только при ударах кусочка сыра или при запуске нового уровня. За них отвечает класс BackSprite.
Верхний слой — это спрайты, которые постоянно перемещаются по экрану. Они должны постоянно перерисовываться. Данные спрайты реализуются классом ForeSprite.
Классы Background, BackSprite и ForeSprite находятся в базовом классе Sprite, который используется программой для хранения информации о картинках и их расположении на экране. Также библиотека содержит класс PlayField, который поддерживает список спрайтов и управляет их видом на экране. Нам придется переписать почти весь код с учетом нового добавленного класса.
Основной движок игры просто управляет движением передних спрайтов, а также отслеживает состояние и позицию фоновых спрайтов. Данная версия библиотеки спрайтов немного отличается от прежней версии игры. Сыр теперь уничтожает томаты при движении вниз к нижней части экрана. Сыр может застрять позади линии томатов, набирая тем самым призовые очки. Автор игры автор Роб Майлз предлагает изучить применение спрайтов на примере другой игры, «Salad Rescue». Вам придется самостоятельно изучить эту игру.
Версия игры, использующая спрайты, располагается в папке BouncerSprite, которая входит в состав материалов для книги, расположенных на сайте издательства «Питер».
Другие игры
Как уже говорилось ранее, в документации MSDN имеется множество примеров различных игр. Если вы проявите настойчивость, то самостоятельно найдете эти примеры и сможете разобрать их. Также стоит посетить сайт CodeProject, где по адресу www.codeproject.com/netcf/#Games расположился специальный подраздел, посвященный играм для .NET Compact Framework (рис. 11.10).

