Delphi Wellenbewegung - Sinuskurve


MaxMüller123

Grünschnabel
Hi,
ein Kumpel und ich programmiern für die Schule ein kleines Spiel. Hierfür bräuchte ich die Animation eines Flußes in 2d.
Trotz mittlerweilen schon ein paar Jahren Info bin ich nun wirklich nicht so der Pro, von daher bitte Rücksicht nehmen sollte die Frage etwas bescheuert klingen.
Die Flußanmation soll nicht sehr aufwendig sein und vertikal verlaufen.
In der Schule hatten wir mal ne Sinuskurve, diese wollte ich nun verwenden, indem ich mehrere Sinuskruven eng nebeneinander ablaufen lasse ( Farbe: Blau --> Fluss )
Der Quelltext sieht so aus:

Code:
...
var sh1: array[1..100] of tshape;
    sh2: array[1..100] of tshape;
    sh3: array[1..100] of tshape;
    sh4: array[1..100] of tshape;
    sh5: array[1..100] of tshape;
    zeit:integer=0;
    start:boolean=false;
    interferenz:boolean=false;
    Amplitude, Frequenz: integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var   i: integer;
begin
For i:= 1 To 100 Do begin
sh1[i]:=tshape.create(form1);
sh1[i].parent:=form1;
sh1[i].Width:=15;
sh1[i].Height:=15;
sh1[i].Shape:=stRoundSquare;
sh1[i].Brush.color:=clblue;
sh1[i].Pen.color:=clblue;
sh1[i].Top:=216;
sh1[i].Left:=18+i*5;
end;

For i:= 1 To 100 Do begin
sh2[i]:=tshape.create(form1);
sh2[i].parent:=form1;
sh2[i].Width:=15;
sh2[i].Height:=15;
sh2[i].Shape:=stRoundSquare;
sh2[i].Brush.color:=clblue;
sh2[i].Pen.color:=clblue;
sh2[i].Top:=216;
sh2[i].Left:=18+i*5;
end;

For i:= 1 To 100 Do begin
sh3[i]:=tshape.create(form1);
sh3[i].parent:=form1;
sh3[i].Width:=15;
sh3[i].Height:=15;
sh3[i].Shape:=stRoundSquare;
sh3[i].Brush.color:=clblue;
sh3[i].Pen.color:=clblue;
sh3[i].Top:=216;
sh3[i].Left:=18+i*5;
end;

For i:= 1 To 100 Do begin
sh4[i]:=tshape.create(form1);
sh4[i].parent:=form1;
sh4[i].Width:=15;
sh4[i].Height:=15;
sh4[i].Shape:=stRoundSquare;
sh4[i].Brush.color:=clblue;
sh4[i].Pen.color:=clblue;
sh4[i].Top:=216;
sh4[i].Left:=18+i*5;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var   i: integer;
begin

Amplitude:=StrToInt(EAmplitude.Text);
Frequenz:=StrToInt(EFrequenz.Text);
inc(zeit);

For i:= 1 To 100 Do begin
sh1[i].Top:=220+round(Amplitude*sin((2*pi/Frequenz)*(zeit-sh1[i].Left/5)));
end;

For i:= 1 To 100 Do begin
sh2[i].Top:=235+round(Amplitude*sin((2*pi/Frequenz)*(zeit-sh2[i].Left/5)));
end;

For i:= 1 To 100 Do begin
sh3[i].Top:=250+round(Amplitude*sin((2*pi/Frequenz)*(zeit-sh3[i].Left/5)));
end;

For i:= 1 To 100 Do begin
sh4[i].Top:=265+round(Amplitude*sin((2*pi/Frequenz)*(zeit-sh4[i].Left/5)));
end;
...
Nun 2 Fragen hierzu:
1. Wie bekomme ich diese Sinuskurven in die vertikale ( wenn möglich biite auf einfachen Niveau erklärt ;-D )

2. Bei der Animation entsteht ein Flackern, wie lässt sich dieses ausschalten?

Danke schonmal, hoffe euch nicht mit meinem Text erschlagen zu haben,
Mfg Martin

PS: Falls jemand noch eine andere Methode zur Animation des Flußes einffällt, die nicht allzu kompliziert ist, nur her damit ...
 

CSANecromancer

Erfahrenes Mitglied
Also so ganz spontan würde ich sagen: Tausch doch einfach die Zuweisung an Top und Left aus. Dann sollte sich die Kurve um 90° drehen.

Und was das Flackern angeht: Keine Ahnung, auf was für einem Canvas du die Sachen anzeigst, aber zur Not setze einfach vom Hauptformular die DoubleBuffered-Eigenschaft auf true:
Code:
  TForm1.DoubleBuffered := true;
Diese Eigenschaft musst du allerdings im Source setzen (z.B. im OnCreate), über den Objektinsepktor ist sie nicht erreichbar.