экраном.

Следует создать простое меню, содержащее команды Быстрее и Медленнее. Если пользователь нажмет на левую кнопку, то скорость движения сыра будет увеличиваться. При нажатии на правую кнопку скорость уменьшится. Соответствующий код приведен в листинге 11.11.

Листинг 11.11

private void menuItem1_Click(object sender, System.EventArgs e) {

 changeSpeed(1);

}

private void menuItem2_Click(object sender, System.EventArgs e) {

 changeSpeed(-1);

}

В данной ситуации значения в методе changeSpeed не отслеживаются. Это может привести к ситуации, когда пользователь будет постоянно уменьшать скорость и значение скорости может стать отрицательным. В этом случае движение объекта будет совсем не таким, как это планировал разработчик. А при значительном увеличении скорости движение изображения теряет гладкость.

Добавляем новый объект

Итак, в результате наших усилий по экрану движется кусочек сыра. Настало время добавить новый объект, которым пользователь будет отбивать сыр. Для наших целей вполне подойдет батон хлеба. Вспоминаем предыдущие упражнения, где мы выводили кусочек сыра на экран, и повторяем шаги в той же последовательности для батона хлеба.

□ Добавляем графический файл в проект в виде ресурса.

□ Получаем в коде ссылку на файл из сборки

□ Объявляем две переменные, содержащие координаты батона хлеба.

Соответствующий код приведен в листинге 11.12.

Листинг 11.12

/// <summary>

/// Изображение, содержащее батон хлеба

/// </summary>

private Image breadImage = null;

// Получаем изображение батона хлеба

breadImage = new System.Drawing.Bitmap(

 execAssem.GetManifestResourceStream(@'Bouncer.bread.gif'));

/// <summary>

/// Координата X для батона хлеба

/// </summary>

private int bx = 0;

/// <summary>

/// Координата Y для батона хлеба

/// </summary>

private int by = 0;

На рис. 11.3 показан внешний вид программы на этом этапе.

Рис. 11.3. Изображения хлеба и сыра

Устранение мерцания

Несмотря на то что мы проделали уже очень большую работу, наша программа по-прежнему не лишена недостатков. При запуске программы изображения постоянно мерцают, раздражая пользователя. Это связано с перерисовкой экрана через заданные интервалы времени. Каждые 50 миллисекунд экран закрашивается белым фоном, а затем на экран выводятся два объекта. Если не устранить этот недостаток, то никто не захочет играть в игру.

Решение проблемы лежит в использовании специальной техники, называемой двойной буферизацией. Двойная буферизация обеспечивает плавную смену кадров. Технология позволяет рисовать необходимые изображения в специальном буфере, который находится в памяти компьютера. Когда все необходимые изображения будут выведены в буфере, то готовое окончательное изображение копируется на экран. Процесс копирования идет очень быстро, и эффект мерцания пропадет. Для реализации этой идеи надо создать новый объект Bitmap. Именно на нем будут отображаться все рисунки, а потом останется только скопировать объект в нужную позицию. Также потребуется переписать метод Form1_Paint, как показано в листинге 11.13.

Листинг 11.13

/// <summary>

/// картинка-буфер

/// </summary>

private Bitmap backBuffer = null;

private void Form1_Paint(object sender,

 System.Windows.Forms.PaintEventArgs e) {

 // Создаем новый буфер

 if (backBuffer == null) {

  backBuffer = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);

 }

 using (Graphics g = Graphics.FromImage(backBuffer)) {

  g.Clear(Color.White);

  g.DrawImage(breadImage, bx, by);

  g.DrawImage(cheeseImage, cx, cy);

 }

 e.Graphics.DrawImage(backBuffer, 0, 0);

}

При первом вызове метода Form1_Paint создается буфер для приема изображений, который объявлен как переменная backBuffer. Затем данный буфер использует контекст устройства для вывода изображений. И, наконец, метод DrawImage из графического контекста формы копирует изображение из буфера и выводит его на экран.

После запуска программы станет понятно, что окончательно избавиться от мерцания не удалось. Хотя улучшения есть, тем не менее, небольшое мерцание объектов все же осталось. Это связано с особенностью перерисовки на уровне системы. Когда Windows рисует объекты на экране, она сначала заполняет его цветом фона. Затем при наступлении события Paint система рисует игровые элементы поверх фона. Поэтому, несмотря на наши ухищрения, мы по-прежнему видим неприятный эффект мерцания.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату