es gibt auch eine einfachere Möglichkeit, bei der man auf schwierige mathematische Funktionen verzichten kann:
Bin über das Steigungsdreieck drauf gekommen. Der X/Y-Wert soll sich folgender Maßen bei jedem aufruf des Timers verhalten:
der X-wert wird mit dem Winkel, der Y-Wert mit der Stärke vom Anfangspunkt(also hier das Kanonerohr) aus addiert. Also haben wir nun schon eine Gerade. Zieht man nun bei jedem timer-aufruf 1(oder eine beliebige zahl) vom Winkel ab entsteht eine Kurve, die einer Parabel sehr ähnelt!
Hier ist meine Timer procedure:
Delphi-Quellcode:
if (Panzer.KugelX < Image1.Width) and (Panzer.KugelY < Image1.Height) then
begin
Panzer.HWinkel := Panzer.HWinkel -1; //Winkel wird immer kleiner bzw.
Panzer.zeichne(Image1.Canvas); //procedure für den Panzer/Umgebung
Panzer.feuer(Image1.Canvas); //procedure für die Kugel
end
Ich habe außerdem beim setzen der Werte für das "Steigungsdreieck" beide Werte noch durch 10 geteilt, da es sonst zu steile Kurven sind:
Delphi-Quellcode:
procedure TPanzer.feuer(canv: TCanvas);
begin
KugelX := KugelX + Round(self.FHPower / 10);
KugelY := KugelY - Round(self.FHWinkel / 10);
canv.Ellipse(KugelX-3,KugelY-3, KugelX+3,KugelY+3);
end;