Движение капель воды

Skrinshot.jpg

Задача. Создать анимацию "капель воды" на языке программирования Delphi

В процедуре FormCreate задать:
1. размеры области прорисовки;
2. палитру цветов;
3. используемые цвета.

В процедуре TForm1.Timer1Timer:
1. задать функцию для траектории движения каждой "капли" отдельно - SIN или COS и шаг;
2. в цикле указать количество движущихся "капель";
3. задать диаметр "капель";
4. прорисовать полученный результат.

Движение капель происходит в цикле. Их координаты хранятся в массиве и определяются функциями SIN или COS, а также шагом. В случае совпадения координат, капли сталкиваются друг с другом.

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type co_ordinate = record
  x,y : integer;
end;
type scanline    = array[0..319] of byte;
 
var
 Form1: TForm1;
  Threshold  : integer;
  blobimage  : tbitmap;
  blobs      : array[0..5] of co_ordinate;
  Frame      : Cardinal;
  drawing    : boolean;
 
implementation
 
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
timer1.Interval := 30;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var Temp : integer;
    pal  : PLogPalette;
    hpal : HPALETTE;
begin
 //область прорисовки
  blobimage        := TBitmap.create;
  blobimage.width  := 320;                //размеры области рисования
  blobimage.height := 240;
  blobimage.PixelFormat:=pf8bit; // установка формата пикселей
    Image1.Picture.Bitmap := blobimage;
    pal := nil;
  try     //функция отвечающая за цвета
    GetMem(pal, sizeof(TLogPalette) + sizeof(TPaletteEntry) * 255);   // выделение памяти под цвета
    pal.palVersion := $300;
    pal.palNumEntries := 256;
    for temp := 0 to 255 do
    begin
      pal.palPalEntry[temp].peRed   := 255-temp;{(temp * 4)-1;}
      pal.palPalEntry[temp].peGreen := 0;
      pal.palPalEntry[temp].peBlue  := 128- temp;
    end;
 
    hpal := CreatePalette(pal^); //создание палитры цветов
          image1.Picture.Bitmap.Palette := hpal;
  finally
      FreeMem(pal);
  end;
  timer1.Enabled := true; // вход в процедуру timer1
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var X_Loop, Y_Loop, i : integer;
    Value, t          : integer;
    Scan              : ^scanline;  //указатель на массив байтов
begin
 Frame := frame + 1; //инкремент при каждом вызове timer1
if drawing = false then
begin
//функция задает движение капли
//изменение местоположения капель с каждой итерацией
 
  blobs[0].x := 160 + round(150 * COS((2 * frame) * 0.01745329252222));
  blobs[0].y := 100 + round(90 * COS((4 * frame) * 0.01745329252222));
  blobs[1].x := 180 + round(150 * SIN((6 * frame) * 0.01745329252222));
  blobs[1].y := 120 + round(90 * SIN((3 * frame) * 0.01745329252222));
  blobs[2].x := 180 + round(150 * COS((7 * frame) * 0.01745329252222));
  blobs[2].y := 130 + round(90 * COS((5 * frame) * 0.01745329252222));
  blobs[3].x := 140 + round(150 * COS((3 * frame) * 0.01745329252222));
  blobs[3].y := 100 + round(90 * COS((2 * frame) * 0.01745329252222));
  blobs[4].x := 160 + round(150 * SIN((4 * frame) * 0.01745329252222));
  blobs[4].y := 100 + round(90 * SIN((2 * frame) * 0.01745329252222));
  blobs[5].x := 100 + round(150 * SIN((2 * frame) * 0.01745329252222));
  blobs[5].y := 140 + round(90 * SIN((3 * frame) * 0.01745329252222));
 
 
  drawing := true;
 
  // цикл по размеру формы
  For Y_Loop := 0 to 239 do
  begin
 
    scan := image1.Pic
 
ture.Bitmap.ScanLine[y_loop]; //инициализация указателя scan
    for X_Loop := 0 to 319 do
    begin
      t := 0;
      For i := 0 to 5 do       //количество бегающих кружков
begin
        // (x-x0)^2 + (y-y0)^2
        value := (Blobs[i].X-X_loop)*(Blobs[i].X-X_Loop);
        value := value + (Blobs[i].Y-Y_loop)*(Blobs[i].Y-Y_Loop);
        if value < 1 then value := 1;
        t := t+ (10000 div value);    //диаметр капли
      end;
      t := 255-t;
      if t < 0 then t := 6;
      Scan[x_loop] := t;
 
 
    end;
  end;
 
  Image1.Refresh;
  drawing := false;
 
  end;
end;
 
 
 
end.
 
end.

Ключевые слова: 
анимация, капли, Delphi
ВложениеРазмер
KAPLI_VODY.rar164.83 кб