Пример 4. Создание класса

 

Создадим приложение, демонстрирующее анимацию изображений, загруженных из графических файлов. В данном примере используется два графических файла с расширением bmp. Один используется в качестве фонового изображения, другой будет отображаться в качестве движущейся картинки. Графические файлы необходимо разместить в той же папке где будет exe-файл приложения.

Разместите на форме компоненты Image и Timer.

 

Для создания движущихся изображений создадим новый класс, который необходимо описать в разделе Type

 

type

  TForm1 = class(TForm)

    Timer1: TTimer;

    Image1: TImage;

    procedure Timer1Timer(Sender: TObject);

    procedure FormClose(Sender: TObject; var Action: TCloseAction);

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

  //новый класс для создания движущихся изображений

  TPic = class(TObject)

     fX, fY,                   // координаты изображения

     fW, fH : Integer;         // ширина и высота изображения

     fPic,                     // поле для загрузки картинки

     fBuf   : TBitmap;         // поле для хранения части экрана, которая должна быть очищена

     fBufRct,                  // поле, описывающее область картинки

     fBackRct : TRect;         // поле, описывающее область фона

     {}

     constructor Create;       // конструктор

     destructor Free;          // деструктор

     {описание свойств класса}

    property X : integer read fX write fX;

     property Y : integer read fY write fY;

     property Width : integer read fW write fW;

     property Hight : integer read fH write fH;

     {описание методов класса}

     procedure Load( filename : string );              // загрузка изображения

     procedure Show(Holst : TImage; Back : TBitmap);   // отображение картинки

     procedure Hide(Holst : TImage);                   // очищение области экрана

  end;

 

 

Объявление переменных и констант:

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

const

  ns = 20;     // количество движущихся объектов

 

В разделе указания переменных объявляем массив переменных, тип которых соответствует созданному классу:

 

var

  fon : TBitmap;

  Snow : array[1..ns] of TPic;

 

После объявления переменных, констант и раздела implementation необходимо описать функции конструктора, деструктора и методы класса:

 

constructor TPic.Create;

begin

  fPic := TBitmap.Create;          // создание двух битовых матриц для загрузки картинки и

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

  fX := 0; fW := 0;                // задание координат и размеров изображения

  fY := 0; fH := 0;

end;

destructor TPic.Free;

begin

  fPic.Free;                       // уничтожение битовых матриц

  fBuf.Free;

end;

 

procedure TPic.Load;

begin

  fPic.LoadFromFile(filename);     // загрузка картинки в битовую матрицу

  fPic.Transparent := true;        // установка прозрачного цвета у загруженной картинки

  fW := fPic.Width;                // ширина и высота устанавливаются равными

  fH := fPic.Height;               // ширине и высоте загруженной картинки

  fBuf.Width := fW;

  fBuf.Height := fH;

  fBufRct := Bounds(0,0,fW,fH);    // определение области для хранения в буфере

end;

 

procedure TPic.Show;

begin

  fBackRct := Bounds(fX,fY,fW,fH);

  fBuf.Canvas.CopyRect(fBufRct,Back.Canvas,fBackRct);      {копирование части изображения, определяемой прямоугольником fBackRct, до области на фоне, определяемой прямоугольником fBufRct }

  Holst.Canvas.Draw(fX,fY,fPic);   // рисование объекта fPic в месте с координатами fX,fY

end;

 

procedure TPic.Hide;

begin

  Holst.Canvas.Draw(fX,fY,fBuf);   // рисование объекта fBuf в месте с координатами fX,fY

end;

 

Теперь опишем процедуру обработки событий, связанных со временем:

 

procedure TForm1.Timer1Timer(Sender: TObject);

var i : integer;

begin

     for i:=1 to ns do begin

       Snow[i].Hide(form1.Image1);              // стирание предыдущего изображения

       Snow[i].Y := Snow[i].Y + 5;              // изменение координат изображения

       Snow[i].X := Snow[i].X +random(10)-5;

       {граничные условия}

       if Snow[i].Y>form1.Image1.height then Snow[i].Y:=-Snow[i].Hight;

       if Snow[i].X>form1.Image1.width then Snow[i].X:=-Snow[i].Width;

       if Snow[i].X<-Snow[i].Width then Snow[i].X:=form1.Image1.width;

       Snow[i].Show(form1.Image1,fon);

    end;

end;

 

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

 

procedure TForm1.FormCreate(Sender: TObject);

var i : integer;

begin

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

  fon.LoadFromFile('fon.bmp');              // загрузить и вывести фон

  Form1.Image1.canvas.Draw(0,0,fon);

  for i:=1 to ns do begin                   //Создание и инициализация

    Snow[i] := TPic.Create;                 //изображений

    Snow[i].Load('f.bmp');

    Snow[i].X := 10+i*15;

    Snow[i].Y := random(Image1.Height);

    Snow[i].Show(form1.Image1,fon);

  end;

 

Процедура, описывающая завершение работы программы:

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

  fon.Free;

end;

end;

 

Необходимые графические файлы и EXE-файл здесь.