Задача. Создать анимацию "капель воды" на языке программирования Delphi В процедуре FormCreate задать: В процедуре TForm1.Timer1Timer: Движение капель происходит в цикле. Их координаты хранятся в массиве и определяются функциями 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
|
|||||||