Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Images mit Timer "gleiten" lassen


bellasaphira - Mi 07.02.18 21:48
Titel: Images mit Timer "gleiten" lassen
Liebe Community,

zurzeit programmiere ich für die Schule ein Mensch ärgere dich nicht Spiel mit Delphi 7 und verwende dabei als Spielfiguren Images. Außerdem hab ich einen Button mit Random-Funktion, die eine beliebige Zahl zwischen 1 und 6 ausspuckt. Ich habe schon programmiert, dass die Images bei einer sechs aus dem Haus auf das Startfeld "gleiten", was ich mit einem Timer bewerkstelligt habe. Nun treffe ich auf folgendes Problem:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if ImOrange4.Left < ImOrange4.Left +55
  then ImOrange4.Left := ImOrange4.Left +1;

  if ImOrange4.Left = ImOrange4.Left +55
  then Timer2.Enabled := false;
end;

Dies ist jetzt dafür programmiert, dass es sich um ein Feld in die richtige Richtung bewegt. Nun aber funktioniert es nicht, da wenn sich ImOrange4.Left erhöht beide Werte erhöhen, also ImOrange4 und ImOrange4 +55. Somit würde ich niemals ImOrange4 +55 erreichen und das Image würde immer weiter verschoben werden. Habt ihr vllt eine Alternativlösung, wie ich bei dem ersten ImOrange4 immer um 1 erhöhen lasse und das ImOrange4 +55 den Anfangswert beibehält?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 07.02.2018 um 23:23


Symbroson - Mi 07.02.18 22:42

Die einfachste Variante wäre global eine Variable zu definieren, die temporär deine letzte Position oder deine Zielposition speichert - je nachdem was dir besser gefällt.

Ich hätte allerdings eher die Bewegung in einer for-Schleife gemacht und jeweils Application.ProcessMessages; am Ende jedes Durchlaufes aufgerufen. Das spart dir den Timer und du kannst dir sicher sein, dass die Figur dort landet, wo sie soll.


Delete - Do 08.02.18 01:28

- Nachträglich durch die Entwickler-Ecke gelöscht -


bellasaphira - Di 20.02.18 15:28

Dankeschön für die ganzen Tipps^^

Ich hab jetzt eine globale Variable und stoße jetzt auf ein anderes Problem, was ich nicht wirklich verstehe:

Ich hab ne Prozedur, wo der Timer aufgerufen wird und die Zahl wird immer um 1 gesenkt...
Aber das Images bewegt sich nur um 1 nach rechts.
Das Merkwürdige ist, wenn ich eine Showmessage mit einbaue, funktioniert es:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure Orange1;
begin
  Zahl := Zahl-1;
  if Zahl > 0 then begin
   showmessage(inttostr(Zahl));
   Form1.LbChanges.Caption := inttostr(Zahl);
   x := Form1.ImOrange4.Left;
   Form1.Timer2.enabled := true;
   Orange1;
   end
  else exit;
end;

Habt ihr vllt eine Lösung für mich, wie ich die Showmessage weglassen kann?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Delete - Di 20.02.18 16:37

- Nachträglich durch die Entwickler-Ecke gelöscht -


bellasaphira - Di 20.02.18 22:46

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Gern geschehen, auch wenn du die Tipps gekonnt ignorierst. :D


Ich kann leider mit vielen Dingen nichts anfangen, da wir erst ein Jahr Info haben und unser Lehrer uns ins kalte Wasser geworfen hat, als er gemeint hatte, dass wir jetzt Projektarbeit machen^^
Deswegen verlasssen mich auch meine kognitiven Fähigkeiten, wenn ich den neuen Quellcode von dir betrachte :)
Da ich das Projekt für nächste Woche fertig haben soll, beschränke ich mich auf die "einfacheren" Programmierungen, die ich schneller kapiere... danach baue ich das alles noch aus und verbessere es. Nun zu der Erklärung meines Quellcodes:

x ist die globale Variable, die ich im Timer als Anfangsposition des Images nehme. Die Zahl wird gewürfelt, ist also die Zahl, wie weit man gehen darf.
Hier die Programmierung des Timers:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if ImOrange4.Left <  x +55
  then ImOrange4.Left := ImOrange4.Left +1;

  if ImOrange4.Left =  x +55
  then begin
   Timer2.Enabled := false;
  end;
end;

Der Timer funktioniert eigentlich, mein Problem liegt darin, dass wenn ich die showmessage, die die Zahl anzeigt, nicht habe, das Image nur um 1 (also, als ob man nur eine 1 gewürfelt hätte)nach rechts geht

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Delete - Mi 21.02.18 00:24

- Nachträglich durch die Entwickler-Ecke gelöscht -