logo
Курсовые / Лабораторная работа20-25

Использование битовых образов

В последнем примере изображение формировалось из графических примитивов. Теперь рассмотрим, как можно реализовать перемещение заранее подготовленного при помощи графического редактора изображения.

Как и в предшествующей программе, эффект перемещения объекта (картинки) достигается за счет периодической перерисовки картинки с некоторым смещением относительно ее прежнего положения. Перед выводом картинки в новой точке предыдущее изображение должно быть удалено, а фоновый рисунок, который был перекрыт — восстановлен. Удалить (стереть) картинку и одновременно восстановить фон можно путем перерисовки всей фоновой картинки или только той ее части, которая была перекрыта объектом. В рассматриваемой программе используется второй подход. Изображение объекта выводится применением метода Draw к свойству canvas формы, а стирается путем копирования (метод CopyRect) нужной части фона из буфера в битовый образ, соответствующий поверхности формы. Форма программы приведена на рис. 23.9, а текст — в листинге 3.6. Компонент Timer используется для организации цикла удаления и вывода изображения самолета.

Рис. 23.9. Форма программы "Полет над городом"

Листинг 3.7. Полет над городом

void _fastcall TForml::FormCreate(TObject *Sender)

{

// загрузить фоновый рисунок из bmp-файла

back = new Graphics::TBitmap();

back->LoadFromFile("factory.bmp");

// установить размер клиентской (рабочей)

// области формы в соответствии с размером

//фонового рисунка

GlientWidth = back->Width;

ClientHeight = back->Height;

// загрузить картинку

sprite = new Graphics::TBitmap();

sprite->LoadFromFile("aplane.bmp");

sprite->Transparent = true;

// исходное положение самолета

x=-20; // чтобы самолет "вылетал" из-за левой границы окна У=20;

}

void _fastcall TForml::FormPaint(TObject *Sender)

{

Canvas->Draw(0,0,back); //фон

Canvas->Draw(x,у,sprite); // рисунок

}

void__fastoall TForml::TimerlTimer(TObject *Sender)

{

TRect badRect; // положение и размер области

//фона, которую надо восстановить

badRect = Rect(x,y,x+sprite->Width,y+sprite->Height);

// стереть самолет (восстановить "испорченный" фон)

Canvas->CopyRect(badRect,back->Canvas,badRect);

// вычислим новые координаты спрайта (картинки)

х +=2;

if (х > ClientWidth)

{

// самолет улетел за правую границу формы

// изменим высоту и скорость полета

х = -20;

у = random(ClientHeight —30); // высота полета"

// скорость полета определяется периодом

// возникновения события On Timer,

// который, в свою очередь, зависит

// от значения свойства Interval

Timerl->Interval = random(20) + 10;

// скорость "полета" меняется

// от 10 до 29

}

Canvas->Draw(х,у,sprite);

}

Для хранения битовых образов (картинок) фона и самолета используются два объекта типа TBitmap, которые создает функция TFormi::Formcreate (объявления этих объектов надо поместить в заголовочный файл проекта). Эта же функция загружает из файлов картинки фона (factory.bmp) и самолета (aplane.bmp). Восстановление фона выполняется при помощи метода copyRect, который позволяет выполнить копирование прямоугольного фрагмента одного битового образа в другой. Объект, к которому применяется метод copyRect, является приемником копии битового образа. В качестве параметров методу передаются: координаты и размер области, куда должно быть выполнено копирование; поверхность, с которой должно быть выполнено копирование; положение и размер копируемой области. Информация о положении и размере восстанавливаемой (копируемой на поверхность формы) области фона находится в структуре badRect типа TRect.

Следует обратить внимание на то, что начальное значение переменной х, которая определяет положение левой верхней точки битового образа (движущейся картинки) — отрицательное число, равное ширине битового образа картинки. Поэтому в начале работы программы самолет не виден и картинка отрисовывается за границей видимой области. С каждым событием OnTimer значение координаты х увеличивается и на экране появляется та часть битового образа, координаты которой больше нуля. Таким образом, у наблюдателя создается впечатление, что самолет вылетает из-за левой границы окна.