Vielen danke schon mal für die Antworten.
@Khabarakh, Jap von Mittelpunkt zu Mittelpunkt, deswegen ja auch 6 Richtungen. Das mit den Eckpunkten hab ich noch nicht ganz verstanden, muss ich mir später nochmal angucken ^^
Mit H hab ich nochmal n bisschen rumgespielt, zz. sieht meine Funktion so aus (habs noch nicht getestet, aber in der Theorie funktioniert es):
Delphi-Quellcode:
function GetDestY(APlayer, ATarget: TPoint): Integer;
var
OriX, OriY: Integer;
Begin
OriX := ATarget.X - APlayer.X; // Dient zur Überprüfung des Standortes
OriY := ATarget.Y - APlayer.Y; // des Spielers im Bezug zum Ziel (oben links, oben rechts, etc.)
if ((OriX >= 0) and (OriY >= 0)) or // Ist der Spieler oben links
((OriX <= 0) and (OriY <= 0)) then // oder unten rechts vom Ziel?
Result := ATarget.Y - Round((ATarget.X - APlayer.X) div 2) - APlayer.Y // Zu gehende Felder berechnen
else // Spieler ist oben rechts, oder unten links vom Ziel.
Result := ATarget.Y + Round((ATarget.X - APlayer.X) div 2) - APlayer.Y; // Zu gehende Felder berechnen
End;
function GetDestX(APlayer, ATarget: TPoint): Integer;
Begin
Result := ATarget.X - APlayer.X; // Zu gehende Felder berechnen
End;
function GetH(APlayer, ATarget: TPoint): Integer;
Begin
Result := Abs(GetDestY(APlayer, ATarget)) + Abs(GetDestX(APlayer, ATarget)); // Beträge der zu gehenden Felder addieren
End;
GetDestY berechnet wie weit der Spieler (unabhängig vom drehen) auf der Y-Achse runter oder hoch muss, um so zum Ziel zu stehen dass er nur noch diagonal gehen muss.
GetDestX berechnet wie weit der Spieler (unabhängig vom drehen) diagonal gehen muss, um zum Ziel zu kommen.
GetH addiert dann beide Beträge um die gesamten zu begehenden Felder zu berechnen.