Оглавление Анимация с использованием таймера TTimer


Хотя в принципе можно делать анимацию применяя sleep - для задержки программы на заданное время и Application.ProcessMessages - для прорисовки нового состояния картинки, но делать это не следует. Намного удобнее и безопаснее применять таймер.

Проект 1. Движение объекта Shape (под 45o) с отражением от границ. Границы можно двигать.

Движение запускается щелчком по Shape, останавливается - щелчком по форме. Это выглядит так:



Скачать RAR-архив исходников + .exe(160 Кб)

Текст модуля:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Shape1: TShape;
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormDblClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var x: integer = 2;
y: integer =2;

procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
Timer1.Enabled :=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Shape1.Left :=Shape1.Left+x;
if Shape1.Left >ClientWidth -Shape1.Width - 1
then x :=-2;
if Shape1.Left <1
then x :=2;
Shape1.Top :=Shape1.Top +y;
if Shape1.Top >ClientHeight -Shape1.Height -1
then y :=-2;
if Shape1.Top <1
then y :=2;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
Timer1.Enabled :=false;
end;

procedure TForm1.FormDblClick(Sender: TObject);
begin
Shape1.Left :=0;
end;

end.

Проект 2. Вращение.

Для показа анимации подготовил 8 картинок *.bmp (по 11Кб), показывающих фазы вращения. В программе объявил глобальный массив
var KK: array [1..8] of TBitMap; ii: integer = 1;
При создании формы: создал эти объекты KK и загрузил в них картинки из файлов.
Для показа анимации поставил на форму объект Im1: TImage; и таймер.
Обработчик T1Timer через заданный интервал времени присваивает:
Im1.Picture.Bitmap:= KK[ii];
Это выглядит так:



Скачать RAR-архив исходников + .exe(170 Кб)


Текст модуля:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Im1: TImage;
    T1: TTimer;
    btnMinus: TButton;
    btnPlus: TButton;
    L1: TLabel;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure T1Timer(Sender: TObject);
    procedure btnMinusClick(Sender: TObject);
    procedure btnPlusClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var KK: array [1..8] of TBitMap; ii: integer = 1;

procedure TForm1.FormCreate(Sender: TObject);
var ii: integer;
begin
  for ii:=1 to 8 do
    KK[ii]:= TBitMap.Create;
    
  KK[1].LoadFromFile('ris1.bmp');
  KK[2].LoadFromFile('ris3.bmp');
  KK[3].LoadFromFile('ris5.bmp');
  KK[4].LoadFromFile('ris7.bmp');
  KK[5].LoadFromFile('ris9.bmp');
  KK[6].LoadFromFile('ris11.bmp');
  KK[7].LoadFromFile('ris13.bmp');
  KK[8].LoadFromFile('ris15.bmp');
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  T1.Enabled := not T1.Enabled;
end;

procedure TForm1.T1Timer(Sender: TObject);
begin
  Im1.Picture.Bitmap:= KK[ii];
  ii:= ii + 1;
  if ii > 8 then ii := 1;
end;

procedure TForm1.btnMinusClick(Sender: TObject);
begin
  T1.Interval := T1.Interval - 5;
  L1.Caption:= IntToStr(T1.Interval);
end;

procedure TForm1.btnPlusClick(Sender: TObject);
begin
  T1.Interval := T1.Interval + 5;
  L1.Caption:= IntToStr(T1.Interval);  
end;

end.
Rambler's Top100
Hosted by uCoz