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



BeitragVerfasst: Mi 15.02.17 18: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2124
Erhaltene Danke: 390

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 15.02.17 19:57 
Guten Abend leuchtfeuer und Willkommen,

für den Anfang sollte es reichen, im OnTimer Ereignis des TTimer Objektes, jenes graphische Objekt um eine bestimmte Distanz zu verschieben:
ausblenden Delphi-Quelltext
1:
GraphikObjekt.Left := GraphikObjekt.Left + 1// v.l.n.r.					

Die Eigenschaft TTimer.Interval (Angaben in MilliSekunden) bestimmt die Wiederholungsrate des Vorganges.
Nicht vergessen den Timer .Enabled auf true zu setzen.
Für genauere Zeit- und Geschwindigkeitsmessungen, siehe Timebased Movement

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
leuchtfeuer Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 15.02.17 20: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2124
Erhaltene Danke: 390

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 16.02.17 01:37 
Mh ja, sieht bestimmt lustig aus. :D
Der TTimer wiederholt dabei mit dem TTimer.Interval jenen Code im TTimer.OnTimer Ereignis.
D.h. ist das Interval z.B. auf 1000 (1 Sekunde) gesetzt, wird pro Sekunde der Schleifendurchlauf von Anfang bis Ende durchgeführt, und das solange der TTimer aktiv ist (TTimer.Enabled := true).

Hier reicht es mit if abzufragen, ob panel1.Left = 10 ist. Wenn ja, dann den TTimer.Enabled auf false setzen. Und wenn du ihn wieder brauchst, dann wieder auf true setzen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Slipstream
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 26
Erhaltene Danke: 5



BeitragVerfasst: Do 16.02.17 08: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.