procedure ZmenitSmer(var NovySmer:SmerKulicky); //metoda otočí směr kuličky begin if NovySmer=Form1.Width then smer:=skNahoruDoleva; end; skDoluDoprava: begin x:=x+3; y:=y+3; if y+PKulicka.Height>= Form1.Height then smer:=skNahoruDoprava; if x+PKulicka.Width>=Form1.Width then smer:=skDoluDoleva; end; skDoluDoleva: begin x:=x-3; y:=y+3; if y+PKulicka.Height>= Form1.Height then smer:=skNahoruDoleva; if x<=PKulicka.Width then smer:=skDoluDoprava; end; skNahoruDoleva: begin x:=x-3; y:=y-3; if y<=PKulicka.Height then smer:=skDoluDoleva; if x<=PKulicka.Width then smer:=skNahoruDoprava; end end; //of case end; muzeByt:=true; //předpokládáme, že kulička je volném místě WaitForSingleObject(hMutex,INFINITE); //obsazení mutexu for i:=1 to 5 do //kontrola, zda na novém místě již není jiná kulička begin for ii:=1 to 50000000 do ; //zdrzuj(100000); //zpomalovací smyčka if i=ID then continue; //vlastní pozice se vynchává if ((abs(kulicky[i].y-Dalsikulicka.y)<=(PKulicka.Height)) //pokud je and (abs(kulicky[i].x-Dalsikulicka.x)<=(PKulicka.Width))) then begin muzeByt:=false; //nová pozice není volná ZmenitSmer(Kulicky[i].Smer); //kulička na tomto místě se odrazí ZmenitSmer(Kulicka.Smer); //aktuální kulčka se také odrazí end; end; ReleaseMutex(hMutex); //uvolnění mutexu !!!!!! if muzebyt then //pokud je nové místo volné begin kulicky[ID]:=DalsiKulicka; //umístění kuličky na toto místo Kulicka:=DalsiKulicka; //schovat si původní souřadnice synchronize(prekresli); //vykreslit novou kuličku end else begin DalsiKulicka:=kulicka; //jinak vrátit původní souřadnice end; until terminated; end; //of TVlakno.Execute;