tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
1352
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MaxMüller123 MaxMüller123 ist offline Grünschnabel
    Registriert seit
    Jan 2009
    Beiträge
    1
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    
    ...
    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 ...
     

  2. #2
    Registriert seit
    Mar 2004
    Beiträge
    441
    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 delphi:
    1
    
      TForm1.DoubleBuffered := true;
    Diese Eigenschaft musst du allerdings im Source setzen (z.B. im OnCreate), über den Objektinsepktor ist sie nicht erreichbar.
     

Ähnliche Themen

  1. Koordinatensystem mit Sinuskurve in Delphi
    Von jonney im Forum Delphi, Kylix, Pascal
    Antworten: 1
    Letzter Beitrag: 17.12.10, 20:01
  2. sinuskurve c#
    Von deen_90 im Forum .NET Café
    Antworten: 9
    Letzter Beitrag: 31.03.08, 23:18
  3. Delphi - Sinuskurve
    Von shapeless im Forum Delphi, Kylix, Pascal
    Antworten: 4
    Letzter Beitrag: 24.09.05, 22:31
  4. sinuskurve berechnen
    Von 123arne im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 09.06.05, 08:16
  5. Sinuskurve? Wie?
    Von checkerno1 im Forum Photoshop
    Antworten: 6
    Letzter Beitrag: 08.11.01, 07:02