Autor Beitrag
leuchtfeuer
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 15.02.17 19:56 
Hallo :D ,
ich bin neu hier und ich hoffe auf die Hilfe von vielleicht einem schlauen Köpfchen :)

Ich möchte eine Rennstrecke programmieren. Das heißt am Start stehen zwei bis drei Personen, welche sich dann in einer bestimmten Zeit auf der x-Achse nach rechts bewegen, damit sie im Ziel ankommen.
Leider bin ich kein Profi im Programmieren und noch recht unerfahren, deshalb weiß ich nicht wirklich, wie ich das ganze beginnen soll.
Wenn jemand Vorschläge oder eine Hilfestellung weiß, wäre ich ihm sehr dankbar, wenn er sie vielleicht mit mir teilen würde.

Für manche mag das bestimmt recht simpel sein, nur leider für mich nicht :oops:
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 15.02.17 20:57 
- Nachträglich durch die Entwickler-Ecke gelöscht -
leuchtfeuer Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 15.02.17 21:27 
Dankeschön, du hast mir damit meinen Abend gerettet. Ich war schon kurz vor der Verzweiflung :D

Eine Frage hab ich noch. Das Bild bewegt sich ja jetzt in einer Endlosschleife nach rechts. Kann ich irgendwie einen Endpunkt festlegen?
Ich hab es mit einer Schleife versucht und am Ende geschrieben
until panel1.Left = 10;
Aber das sieht bei mir sehr merkwürdig aus XD
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 16.02.17 02:37 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Slipstream
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 26
Erhaltene Danke: 5



BeitragVerfasst: Do 16.02.17 09:12 
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:

ausblenden Delphi-Quelltext
1:
2:
3:
If Grafik1.Left + Grafik1.Tag + Grafik1.Width <= 500 Then
   Grafik1.left := Grafik1.Left + Grafik1.Tag Else // wenn die Laufgrafik zurücklaufen soll, bevor sie am Ende der Strasse anstösst
   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:

ausblenden 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; // ab hier rennen deine Laufgrafiken los
end;


Ein zweiter Button soll das Anhalten ermöglichen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Procedure Form1.ButtonHaltClick(Sender: TObject);
begin
  MyTimer.Enabled := False; // ab hier hören deine Laufgrafiken auf zu rennen
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; // das ist wichtig, damit der Prozessor weitere Messages wie die vom Halt-Button verarbeitet
end;


Alles im Foreneditor getippt und ungeprüft. Soll auch nur als Hinweis dienen.