Du könntest schon Einiges an Klarheit schaffen, wenn du
Unterfunktionen benützen würdest.
Bei 3 Objekten braucht man noch nicht unbedingt eine Schleife, aber bei 3 maliger Wiederholung von gleichem Code braucht man Funtkionen!
Das hier:
sqrt(sqr(abs(maus.x - hindernis.hx)) + sqr(abs(maus.y - hindernis.hy))
ist doch nix anderes als die abgewandelte Formel von Phytagoras.
Delphi-Quellcode:
function Abstand(x,y:Integer):Double;
begin
result := sqrt(sqr(x)+sqr(y));
end;
Der Aufruf von abs() ist übrigens völlig überflüssig.
Und schon sieht der Code besser aus:
Delphi-Quellcode:
repeat
hindernis1.initiate(clblue, random(image1.width - 20) + 10,random(image1.height- 20) + 10, random(40) + 81);
until (Abstand(maus.x - hindernis1.hx, maus.y - hindernis1.hy) > (maus.r + hindernis1.hr) + 8));
Jetzt müsste man noch den Ausdruck nach Until vereinfachen.
Dazu ist es wichtig, dass
maus und
hindernis von der gleichen Kreisklasse abgeleitet sind.
Dann könnte man nämlich den Abstand der Kreisobjekte in einer Funtkion berechnen:
Delphi-Quellcode:
function TKreis.KreisrandAbstand(v:TKreis):double;
begin
result := Abstand(x - v.x, y - v.y) - (r + v.r);
end;
Delphi-Quellcode:
repeat
hindernis1.initiate(clblue, random(image1.width - 20) + 10,random(image1.height- 20) + 10, random(40) + 81);
until maus.KreisrandAbstand(hindernis1) > 8;