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.