unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Spin; type TForm1 = class(TForm) Image1: TImage; konec: TButton; Button1: TButton; Button2: TButton; Timer1: TTimer; SpinEdit1: TSpinEdit; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure konecClick(Sender: TObject); procedure SpinEdit1Change(Sender: TObject); private { Private declarations } public { Public declarations } end; type tcircle = object c : integer; x,y : real; {x,y - souradnice} vx,vy : real; {vx,vy - rychlost} r : real; constructor init; procedure show; virtual; procedure hide; virtual; procedure imove; virtual; procedure move; virtual; destructor done; end; tcirclev = object(tcircle) vr : real; {rychlost zmeny polomeru} constructor init; procedure imove; virtual; end; pc = ^tcirclev; var Form1: TForm1; a : array[0..255] of pc; kolik : integer; implementation {$R *.DFM} constructor tcirclev.init; begin tcircle.init; vr:=random(3); end; constructor tcircle.init; begin x:=random(form1.image1.width - 30)+15; y:=random(form1.image1.height - 30)+15; vx:=random(9)-4; vy:=random(9)-4; r:=random(11); c:=random($FFFFFF); end; destructor tcircle.done; begin end; procedure tcircle.show; var xx,yy,rr : integer; begin form1.image1.canvas.pen.color:=c; xx:=round(x); yy:=round(y); rr:=round(r); form1.image1.canvas.arc(xx-rr,yy-rr,xx+rr,yy+rr,0,0,1,0); end; procedure tcircle.hide; var xx,yy,rr : integer; begin form1.image1.canvas.pen.color:=$FFFFFF; xx:=round(x); yy:=round(y); rr:=round(r); form1.image1.canvas.arc(xx-rr,yy-rr,xx+rr,yy+rr,0,0,1,0); end; procedure tcircle.imove; var i,w,h : integer; begin; {podminky mezni rychlosti} if abs(vx)>10 then vx:=-0.05; if abs(vy)>10 then vy:=-0.05; {pozadovane posuny} x:=x + vx; y:=y + vy; {mimo obraz, nebo obcas i nahodne, zmen parametry} w:=form1.image1.width; h:=form1.image1.height; if (x+r<0)or(x-r>w)or(c<0)or(c>=$FFFFFF)or(r<1)or (y+r<0)or(y-r>h)or (random(155)=3) then begin i:=random(30)+1; r:=i; x:=random(w-2*i)+i; y:=random(h-2*i)+i; c:=random($FFFFFF); vx:=0;vy:=0; end; {zmen nahodne o malinko i rychlost} vx:= vx+(random(111)/333-0.1667)*1.77; vy:= vy+(random(111)/333-0.1667)*1.77; end; procedure tcirclev.imove; var i : integer; begin; tcircle.imove; {podminky mezni rychlosti} if abs(vr)>3 then vr:=0; {pri velkem prumeru zacni zmensovat} if random(round(r))>30 then vr:=-abs(vr/1.11); if (r<10)and(vr<0) then vr:=vr+random(55)/1000; {pozadovane posuny} r:=r + vr; if (vr<-3) or (vr>3) then vr:=(random(10)+3)/10; vr:= vr+random(133)/1000-0.053; end; procedure tcircle.move; var i : integer; begin; tcircle.hide; tcircle.imove; tcircle.show; end; procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin kolik :=0; for i:=0 to 255 do begin a[i]:=new(pc,init); end; {inicializace pozadovaneho poctu prvku} end; procedure TForm1.Timer1Timer(Sender: TObject); var i : integer; begin {pro vsechny objekty proved jeden posun} for i:=1 to kolik do a[i]^.move; image1.canvas.refresh; end; procedure TForm1.Button1Click(Sender: TObject); begin timer1.enabled:=true; if kolik<255 then begin kolik:=kolik+1; a[kolik]^.show; form1.caption:='Počet objektů: '+inttostr(kolik); end; end; procedure TForm1.Button2Click(Sender: TObject); begin if kolik>0 then begin a[kolik]^.hide; kolik:=kolik-1; form1.caption:='Počet objektů: '+inttostr(kolik); end; end; procedure TForm1.konecClick(Sender: TObject); var i : integer; begin kolik :=0; for i:=0 to 255 do begin Dispose(a[i]); end; halt(0); end; procedure TForm1.SpinEdit1Change(Sender: TObject); begin timer1.interval:=spinedit1.value; end; end.