Порядок выполнения

Пояснения к работе

Эффект перемещения сложной картинки может быть создан путем периодической перерисовки картинки с некоторым смещением относительно ее прежнего положения. При этом предполагается, что перед выводом картинки в новой точке сначала удаляется предыдущее изображение. Удаление картинки может быть выполнено путем перерисовки всей фоновой картинки или только той ее части, которая перекрыта битовым образом движущегося объекта.

Рассмотрим второй подход. Картинка выводится применением метода Draw к свойству Canvas компонента Image, а стирается путем копирования (метод copyRect) нужной части фона из буфера на поверхность компонента Image.

Для хранения битовых образов (картинок) фона и самолета, а также копии области фона, перекрываемой изображением самолета, используются объекты типа TBitMap, которые создаются динамически процедурой FormActivate.

 

Постановка задачи

Разработать приложение, реализующее движение битового образа (картинки) на фоне другой картинки. Примерный вид окна приложения представлен на рисунке.

 

 

1. Создать новый проект.

2. Скопировать в папку, где будет сохранен создаваемый проект, файлы factory.bmp и aplane.bmp.

3. Установить на форме компонент Image и таймер.

Примечание: Компонент Image используется для вывода фона, а компонент Timer — для организации задержки между циклами удаления и вывода на новом месте изображения самолета.

4. Объявить глобальные переменные:

 

Back, bitmap, Buf : TBitMap; // фон, картинка, буфер

// область фона, которая должна быть восстановлена из буфера

BackRet : TRect;

//область буфера, которая используется для восстановления фона

BufRet: Trect;

х,у: Integer; // текущее положение картинки

W,H: Integer; // размеры картинки

 

5. Для формы выбрать событие OnActivate и ввести код:

 

// создать три объекта — битовых образа

Back := TBitmap.Create; // фон

bitmap := TBitmap.Create; // картинка

Buf := TBitmap.Create; // буфер

// загрузить и вывести фон

Back.LoadFromFile('factory.bmp');

Form1.Image1.Canvas.Draw(0,0,Back);

// загрузить картинку, которая будет двигаться

bitmap.LoadFromFile('aplane.bmp');

bitmap.Transparent := True; // определим "прозрачный" цвет

bitmap.TransParentColor := bitmap.canvas.pixels[1,1];

// создать буфер для сохранения копии области фона,

// на которую накладывается картинка

W:= bitmap.Width; H:= bitmap.Height;

Buf.Width:= W; Buf.Height:=H;

Buf.Palette:=Back.Palette;

// Чтобы обеспечить соответствие палитр

Buf.Canvas.CopyMode:=cmSrcCopy;

// определим область буфера, которая будет использоваться

// для восстановления фона

BufRet:=Bounds(0,0,W,H);

// начальное положение картинки

х := -W; у := 20;

// определим сохраняемую область фона // и сохраним ее

BackRet:=Bounds(x,y,W,H);

Buf.Canvas.CopyRect(BufRet,Back.Canvas,BackRct);

 

6. Для таймера ввести код:

 

// восстановлением фона (из буфера) удалим рисунок

Form1.image1.canvas.Draw(x,y,Buf);

x:=x+2;

if x>fоrm1.Image1.Width then x:=-W;

// определим сохраняемую область фона

BackRet:=Bounds(x,у,W,H);

// сохраним ее копию

Buf.Canvas.CopyRect(BufRct,Back.Canvas,BackRct);

// выведем рисунок

Form1.image1.canvas.Draw(x,y,bitmap);

 

7. Для формы выбрать событие OnClose и ввести код:

 

// освободим память, выделенную для хранения битовых образов

Back.Free;

bitmap.Free;

Buf.Free;

8. Проверить работу приложения.

9. Самостоятельно модернизировать приложение, для того чтобы траектория движения соответствовала синусоиде.

10. Результат показать преподавателю.