Mir gefällt die Entwicklung der Diskussion
Das erinnert mich an eine Spielerei von vor 15 Jahren (Herrje, wo ist nur die Zeit hin).
Damals hatte ich nach eingehendem Studieren der Webseite von David Braben angefangen einen Elite-Klon zu schreiben.
Der Code für die Flugbewegung war nicht sonderlich komplex, aber tat seinen Dienst:
Delphi-Quellcode:
function moveToTarget(cur, tar, speed: single): single;
begin
if (cur <> tar) then
begin
if (cur < tar) then
begin
cur := cur + speed;
if (cur > tar) then
cur := tar;
end
else
begin
cur := cur - speed;
if (cur < tar) then
cur := tar;
end;
end;
result := cur;
end;
...
Rcur.x := moveToTarget(Rcur.x, Rtar.x, Rdampen.x);
Rcur.y := moveToTarget(Rcur.y, Rtar.y, Rdampen.y);
Rcur.z := moveToTarget(Rcur.z, Rtar.z, Rdampen.z);
// z-Achsenrotation für Autopilot
if (Rcur.z <> 0) then
begin
thrust.Assign(0, 0, 1);
thrust.Mul(Matrix);
M.RotateAbout(thrust, -Rcur.z);
Matrix.Mul(M);
end;
if (Rcur.x <> 0) then
begin
thrust.Assign(1, 0, 0);
thrust.Mul(Matrix);
M.RotateAbout(thrust, -Rcur.x);
Matrix.Mul(M);
end;
if (Rcur.y <> 0) then
begin
thrust.Assign(0, 1, 0);
thrust.Mul(Matrix);
M.RotateAbout(thrust, -Rcur.y);
Matrix.Mul(M);
end;
// Minimalgeschwindigkeit
if (fSpeedTar < 4) then
fSpeedTar := 4;
fSpeedCur := moveToTarget(fSpeedCur, fSpeedTar, 2);
if (fSpeedCur <> 0) then
begin
thrust.Assign(0, 0, fSpeedCur);
thrust.Mul(Matrix);
Position.Add(thrust);
Movement.Copy(thrust);
end
else
Movement.Assign(0, 0, 0);
Bei der Gelegenheit habe ich den Code mal wieder rausgekramt und gleich um FMX und
GDI+ erweitert. Schon erstaunlich, wie einfach die alte Delphi2 Version auf Delphi7 bzw. XE5/8 portiert werden konnte.