Программирование с C++ Builder



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



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

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

Форма программы приведена на рис. 3.17, а текст — в листинге 3.6. Компонент Timer используется для организации цикла удаления и вывода изображения самолета.



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


Листинг 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 значение координаты х увеличивается и на экране появляется та часть битового образа, координаты которой больше нуля. Таким образом, у наблюдателя создается впечатление, что самолет вылетает из-за левой границы окна.


Книжный магазин