Пример 17.2.

Создать программу демонстрации анимации: движение самолета на фоне фабрики. Проект – приложение. В программе используются два файла растровых картинок, которые надо загрузить в ту же папку, где находится проект приложения:

  • фон – фабрика, файл factory.bmp,
  • движущийся объект – самолет, файл aplane.bmp.

Эти файлы находятся в папке УМД к ЛР.

Форма приложения содержит два компонента:

  • Image1 – для отображения картинки.
  • Timer – таймер для задания скорости полета самолета. Скорость задается в свойстве таймера Интервал. Примем скорость, равную 1.

paskal99

Листинг модуля формы

unit prg_17_2_;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,  StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)

Edit1: TEdit;

Image1: TImage;

Timer1: TTimer;

procedure FormActivate(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

private

{ private declarations }

public

{ public declarations }

end;

var

Form1: TForm1;

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

BackRct : TRect;                       // Фон из буфера

BufRct: Trect;                 // Область буфера

x,y:integer;                     // Текущее положение картинки

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

implementation

{ TForm1 }

procedure TForm1.FormActivate(Sender: TObject);

begin

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

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;

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

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

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

x := -W;

y := 20;

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

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

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

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

Form1.image1.canvas.Draw(x,y,Buf);      // Удалим рисунок

x:=x+2;

if x>form1.Image1.Width then x:=-W;

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

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

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

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

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

end;

initialization

{$I prg_17_2_.lrs}

end.

Вид кадра окна приложения при исполнении. Самолет движется слева направо.

paskal100

Выводы

Для работы с изображениями класса TBitmap предназначен компонент TImage.

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

Twitter SEO Community Ваау! News2.ru Chipp Korica SMI2 Google Bookmarks Digg I.ua Закладки Yandex Linkstore Myscoop Communizm Ru-marks Webmarks Ruspace Linkomatic Kli.kz Web-zakladka Zakladok.net Reddit delicious Ma.gnolia Technorati Slashdot Yahoo My Web БобрДобр.ru Memori.ru rucity.com МоёМесто.ru Mister Wong



Copyright © 2009-2010 Программирование на паскале.