Nur mal so für Spaß eine vereinfachte Betrachtungsweise:
Delphi-Quellcode:
type
TFigur = class
Top, Left : Integer;
function AbstandZu( aFigur : TFigur ) : Extended;
end;
TSpieler = class( TFigur )
end;
TZiel = class( TFigur )
end;
TGegner = class( TFigur )
end;
function TFigur.AbstandZu( aFigur : TFigur ) : Extended;
begin
Result := Sqrt( Sqr( Self.Left - aFigur.Left ) + Sqr( Self.Top - aFigur.Top ) );
end;
Und im Code dann:
Delphi-Quellcode:
var
Spieler : TSpieler;
Ziele : TList;
Gegner : TList;
begin
// Gegner berührt?
for idx := 0 to Pred( Gegner.Count ) do
if Spieler.AbstandZu( TFigur( Gegner[idx] ) ) < 10 then // 10 ist jetzt einfach nur als Beispiel genommen
GegnerKollision( TGegner( Gegner[idx] ) ); // Behandlung der Kollision mit einem Gegner
// Ziel berührt?
for idx := 0 to Pred( Ziele.Count ) do
if Spieler.AbstandZu( TFigur( Ziele[idx] ) ) < 10 then // 10 ist jetzt einfach nur als Beispiel genommen
ZielEingefangen( TZiel( Ziele[idx] ) ); // Behandlung der Kollision mit einem Ziel
end;
BTW: Für die Kollisionsbehandlung würde sich hier das Visitor-Pattern anbieten, das habe ich aber bewusst herausgelassen um nicht mehr zu verwirren. Obschon es sehr viel Charme hätte und den Code insgesamt nochmals verkürzen würde.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)