И опять добавляем новые объекты
И опять добавляем новые объекты
На данный момент игра довольно прямолинейна. Надо добавить ей сложности для повышения зрелищности. В игру нужно ввести дополнительный бонус в виде кусочка ветчины, который будет периодически появляться на экране. Если игрок сумеет коснуться его батоном, то заработает несколько дополнительных очков. Но при этом игрок не должен забывать отбивать сыр, чтобы не потерять жизнь. Ветчина появляется на экране на короткое время, и игрок должен сам решить, нужно ему охотиться за ветчиной или отбивать сыр.
Сначала надо добавить графическое изображение ветчины в программу как ресурс. Затем потребуется создать несколько переменных, с помощью которых можно контролировать свойства нового объекта. Соответствующий код приведен в листинге 11.50.
Листинг 11.50
/// <summary>
/// Изображение ветчины
/// </summary>
private Image bonusHamImage = null;
/// <summary>
/// Позиция и ограничивающий прямоугольник для ветчины
/// </summary>
private Rectangle bonusHamRectangle;
/// <summary>
/// Звук, воспроизводимый при столкновении с ветчиной
/// </summary>
private Sound bonusHamSound;
// Получим изображение ветчины
bonusHamImage = new System.Drawing.Bitmap(
execAssem.GetManifestResourceStream(@"Bouncer.ham.gif"));
// Создадим прямоугольник для ветчины
bonusHamRectanglе =
new Rectanglе(0, 0, bonusHamImage.Width, bonusHamImage.Height);
// Получим звук при столкновении с ветчиной
bonusHamSound = new
Sound(execAssem.GetManifestResourceStream((@"Bouncer.pig.wav"));
Для управления изображением ветчины надо создать новый метод, код которого приведен в листинге 11.51.
Листинг 11.51
/// <summary>
/// True, если ветчина на экране
/// </summary>
private bool hamPresent = false;
/// <summary>
/// Интервал от 0 до 10. Чем выше значение,
/// тем чаще ветчина появляется на экране
/// </summary>
private int hamLikelihood = 5;
/// <summary>
/// Отчет времени перед исчезновением ветчины.
/// Устанавливаем случайное число при появлении ветчины.
/// </summary>
private int hamTimerCount;
/// <summary>
/// Случайное число.
/// </summary>
private Random randomNumbers;
/// <summary>
/// Вызывается для активизации ветчины
/// </summary>
private void startHam() {
// не продолжать, если ветчина уже есть на экране
if (hamPresent) {
return;
}
// решаем, как часто выводить ветчину на экран
if (randomNumbers.Next(10) > hamLikelihood) {
// не выводить ветчину на экран
return;
}
// позиция ветчины в случайной позиции на экране
bonusHamRectangle.X =
randomNumbers.Next(ClientSize.Width — bonusHamRectangle.Width);
bonusHamRectangle.Y =
randomNumbers.Next(ClientSize.Height - bonusHamRectangle.Height);
// как долго держится изображение ветчины на экране
// (по крайне мере 50 тиков)
hamTimerCount = 50 + randomNumbers.Next(100);
// делаем ветчину видимой
hamPresent = true;
}
На первый взгляд код кажется сложным. Но все очень просто. Метод вызывается каждый раз при столкновении сыра с томатом. Если ветчина уже отображается на экране, то метод ничего не делает. Если ветчины на экране нет, то программа использует случайное число для принятия решения, нужно ли показывать на экране изображение. Генерируется случайное число в промежутке от 0 до 10. Ветчина не выводится, если это число больше, чем заданная переменная.
В нашем случае значение hamLikelihood равно 5. Это означает, что ветчина будет появляться в половине случаев. При помощи этой переменной можно регулировать частоту появления изображения ветчины на экране. Если метод решит вывести ветчину на экран, он выбирает случайную позицию и устанавливает расположение картинки.
Также метод инициализирует счетчик таймера для отчета длительности присутствия ветчины на экране. Программа использует минимальное время вкупе со случайным периодом. Таким образом, пользователь никогда не будет знать, как долго ветчина будет видима. Каждый раз при обновлении игры программа должна обновлять состояние куска ветчины. Если игрок коснулся изображения ветчины, то надо увеличить счет и удалить изображение. Соответствующий код приведен в листинге 11.52.
Листинг 11.52
/// <summary>
/// Обновляем состояние ветчины
/// </summary>
private void hamTick() {
// ничего не делаем, если ветчина невидима
if (!hamPresent) {
return;
}
if (breadRectangle.IntersectsWith(bonusHamRectangle)) {
// при касании игроком куска ветчины
// прибавляем 100 очков
scoreValue = scoreValue + 100;
messageString = "Счет: " + scoreValue + " Жизнь: " + livesLeft;
// звук касания ветчины
bonusHamSound.Play();
// прячем ветчину с экрана
hamPresent = false;
} else {
// Отчитываем время назад
hamTimerCount--;
if (hamTimerCount == 0) {
// время вышло - удаляем ветчину
hamPresent = false;
}
}
}
Также надо изменить код методов Form1_Paint и updatePosition. Если изображения батона и ветчины пересекаются, то нужно увеличить счет и удалить изображение ветчины. В ином случае надо уменьшить время отображения ветчины или удалить это изображение, если соответствующий период времени уже закончился. Соответствующий код приведен в листинге 11.53.
Листинг 11.53
//(Form1_Paint)
// Выводим на экран кусок ветчины
if (hamPresent) {
g.DrawImage(bonusHamImage, bonusHamRectangle.X, bonusHamRectangle.Y);
}
//(updatePosition)
// Активизируем ветчину
startHam();
//(timerTick)
hamTick();
Но мы можем продолжить улучшение игры, добавляя в нее новые возможности. Все изменения по-прежнему будут происходить в проекте Bouncer. Теперь предстоит создать таблицу лучших результатов, улучшить работу графики и разобраться с применением спрайтов.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Добавляем обработчики событий
Добавляем обработчики событий Главная техника, которую мы используем, чтобы сохранить наш JavaScript «ненавязчивым», — это хранение скрипта в отдельном файле, что предпочтительней, чем смешивать его с разметкой страницы. Чтобы исполнить функции в нашем .js-файле, нам надо
Добавляем новый контакт
Добавляем новый контакт Вы только что установили Skype, поэтому ваш список контактов еще пуст. Вы не можете выбрать из него имя вашего друга, чтобы сразу ему позвонить. Допустим, что вы даже не знаете его Skype-имени, этим проблема еще больше усложняется. Что же можно сделать в
Добавляем тэги
Добавляем тэги Уже при загрузке фотографии можно добавить к ней метки-тэги – для этого в нижней части фотографии имеются специальные кнопочки. Эти метки позволяют указать, кто на этом снимке изображен, и когда, где фотография сделана. Если заснятый товарищ уже
Новые объекты "сетевой собственности"
Новые объекты "сетевой собственности" Приведенный выше анализ некоторых теоретических проблем "интернет-права" подводит нас к рассмотрению еще более интересной проблематики — к вопросу о новых объектах правового регулирования. Эта проблема имеет и большое
Добавляем в шаблон текст
Добавляем в шаблон текст Итак, изменим содержимое нашего шаблона, вставив туда немного текста (листинг П1.4). Ну и сохраним этот файл, например, под именем, соответствующим номеру листинга: listing_1.4.html. Открываем файл и видим следующую картину (рис. П1.9). Рис. П1.9. Файл listing_1.4.html
И опять обмен валют
И опять обмен валют Прикрываясь обменом валют, мошенники могут действовать и более изощренно. Справедливости ради отметим, что им очень помогает жадность и алчность пользователей, желающих быстро обогатиться, не прилагая для этого никаких усилий.Итак, первое, что делает
Объекты DataSet с множеством таблиц и объекты DataRelation
Объекты DataSet с множеством таблиц и объекты DataRelation До этого момента во всех примерах данной главы объекты DataSet содержали по одному объекту DataTable. Однако вся мощь несвязного уровня ADO.NET проявляется тогда, когда DataSet содержит множество объектов DataTable. В этом случае вы можете
Добавляем новый объект
Добавляем новый объект Итак, в результате наших усилий по экрану движется кусочек сыра. Настало время добавить новый объект, которым пользователь будет отбивать сыр. Для наших целей вполне подойдет батон хлеба. Вспоминаем предыдущие упражнения, где мы выводили кусочек
Новые объекты
Новые объекты Продолжим улучшать игру. Теперь в игру будут введены и помидоры. Их изображения тоже надо ввести в состав проекта, как показано в листинге 11.23.Листинг 11.23/// <summary>/// Изображение, содержащее помидор/// </summary>private Image tomatoImage = null;// Получаем изображение
: Опять Нобелевка
: Опять Нобелевка Нобелевский комитет в сто четвертый раз назвал имена лауреатов самой престижной премии за выдающиеся интеллектуальные достижения в области физики, химии и медицины. Денежное вознаграждение в каждой дисциплине составило 10 млн. шведских крон (около 1,3
16.2. Добавляем дождь
16.2. Добавляем дождь Иногда бывает нужен снимок определенной местности, сделанный в дождливую погоду. Чтобы получить такое изображение, не обязательно дожидаться дождя. Можно использовать любую фотографию, а дождь добавить с помощью программы Photoshop. Данный прием очень
Ошибка 0x00000035: опять дефект памяти
Ошибка 0x00000035: опять дефект памяти Ошибка вызывается одним из драйверов высшего уровня, но опять-таки, если опустить все технические подробности, которые вам будут малоинтересны, то причина таки в «битой» оперативной памяти. Нужно проверить оперативную память. Хотя,
Ошибка 0xC000026C: опять драйвер!
Ошибка 0xC000026C: опять драйвер! Невозможно загрузить драйвер. Тут и ежику понятно – проблема в