Sagen wir mal du hast eine TImage mit dem Hintergrundbild und darin bewegst du nun deine Grafik. Unten im Hintergrundbild ist die Strasse von links nach rechts abzulaufen. Die Strasse beginnt sagen wir mal bei x = 10 und endet bei x = 500. Nun musst du dir überlegen, wie schnell sich die Grafik bewegen soll: In welcher Zeit soll die Grafik von 10 bis 500 laufen? Sagen wir mal, dieser Weg soll in 20 Sekunden zurückgelegt werden. Dann bewegst du die Grafik in jeder Sekunde um (500 -10) / 20 Pixel, das wären rund 24 Pixel pro Timerdurchlauf, wenn du den Timer auf 1 Sekunde (1000 Millisekunden) stellst. Wenn du mehrere Grafiken unterschiedlich laufen lassen willst, dann legst du die Schrittweite bei den verschiedenen Laufgrafiken unterschiedlich fest. Im Timer-Ereignis bewegst du dann die Grafiken mit ihrer individuellen Schrittweite: Grafik1.left := Grafik1.Left + Grafik1.Tag ... wenn du die Schrittweite z.B. in der Tag-Eigenschaft speicherst.
Dann musst du noch berücksichtigen, dass die Laufgrafiken eine bestimmte Breite haben, du aber nicht möchtest, dass die Laufgrafik, sagen wir mal mit der Breite 30 Pixel, über das Strassenende hinausbewegt wird. Deshalb fragst du im Timer-Ereignis vor dem Bewegen der Laufgrafik ab, ob ihr rechter Rand an das Strassenende stösst, wenn du sie mit ihrer Schrittweite bewegst:
Delphi-Quelltext
1: 2: 3:
| If Grafik1.Left + Grafik1.Tag + Grafik1.Width <= 500 Then Grafik1.left := Grafik1.Left + Grafik1.Tag Else Grafik1.Left := Grafik1.Left - Grafik1.Tag; |
Dasselbe machst du dann mit den anderen Laufgrafiken.
Um keine Endlosschleife zu produzieren, verwendest du je einen Start- und einen Stop-Button:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Procedure Form1.ButtonStartClick(Sender: TObject); begin Grafik1.Left := 10; Grafik2.Left := 10; Grafik ... MyTimer.Enabled := True; end; |
Ein zweiter Button soll das Anhalten ermöglichen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Procedure Form1.ButtonHaltClick(Sender: TObject); begin MyTimer.Enabled := False; end;
Procedure Form1.MyTimerTimer(Sender: TObject); begin If Grafik1.Left + Grafik1.Tag + Grafik1.Width <= 500 Then Grafik1.left := Grafik1.Left + Grafik1.Tag Else Grafik1.Left := Grafik1.Left - Grafik1.Tag; If Grafik2 ... Application.Processmessages; end; |
Alles im Foreneditor getippt und ungeprüft. Soll auch nur als Hinweis dienen.