Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit Bewegung eines Image --> Bleibt stehen


Waldkauz - Mi 27.05.09 19:19
Titel: Problem mit Bewegung eines Image --> Bleibt stehen
Hallo

Also ich hab das Image1, auf welchem sich das kleinere Image2 mithilfe eines Timers von der rechten unteren Ecke so lange diagonal nach oben und unten Bewegen soll, bis der Timer wieder deaktiviert wird.
Jetzt habe ich aber das Problem, dass das Image2 vorher schräg rauffährt, und dann zwar wieder runter fährt, aber dann in der Ecke (Ausgangsposition) stehen bleibt und nicht wieder rauffährt.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm2.Timer4Timer(Sender: TObject);

if (Image4.Left = 0or (Image4.Top = 0then bewegung:=bewegung*(-1);

if (Image4.Left <=  (Image1.Width-Image4.Width) ) or (Image4.Top <= (Image1.Height - Image4.height) )  then
 begin
 Image4.Left:=Image4.Left-bewegung;
 Image4.Top:=Image4.Top-bewegung;
 end
 else
 begin
 Image4.Top:=Image4.Top-bewegung;
Image4.Left:=Image4.Left-bewegung;
 end

 if (image4.Left = 557 ) and (image4.Top = 332then
 begin
    Image4.Top:=Image4.Top+bewegung;
     Image4.Left:=Image4.Left+bewegung;
 end;


("bewegung" ist eine globale Variable (integer), die mit 1 belegt wurde)


ffgorcky - Mi 27.05.09 20:54

Also ich würde für die Richtungsanzeige (bei nur 2 Richtungen) eher eine boolsche Variable nehmen, z.B. so eine, die ich dann unter den Form-Variablen deklarieren würde:

Delphi-Quelltext
1:
var vonLinksObenNachRechtsUnten:bool;                    

Aber Deine Lösung, die Bewegung durchs Mal-nehmen mit einer negativen Eins umzudrehen ist natürlich auch nicht schlecht!

Oben hast Du ja die Umdrehsituation:

Delphi-Quelltext
1:
2:
if (Image4.Left = 0or (Image4.Top = 0then 
    bewegung:=bewegung*(-1);

Du hast ja jetzt aber leider die Situation vergessen, die Richtung wieder umzudrehen wenn er unten ist:

Delphi-Quelltext
1:
2:
if (Image4.Left >= Image1.Width) or (Image4.Top >= Image1.Height) then 
    bewegung:=bewegung*(-1);


Also insgesamt müsste Dein Quelltext doch so das ganze erfüllen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm2.Timer4Timer(Sender: TObject);
begin
if (Image4.Left <= 0or (Image4.Top <= 0then 
   bewegung:=bewegung*(-1)
else if (Image4.Left >= Form1.Width) or (Image4.Top >= Form1.Height)
   bewegung:=bewegung*(-1);
Image4.Left:=Image4.Left-bewegung;
Image4.Top:=Image4.Top-bewegung;
end;


- Oder habe ich da jetzt gerade nicht so ganz den Überblick über das Problem bekommen?


Waldkauz - Mi 27.05.09 23:19

Nein, leider. Jetzt steckt Image4 sowieso ganz unten und "zittert" ^^


Yogu - Mi 27.05.09 23:25

Das ist ja auch kein Wunder, denn schließlich ist das ziemlich optimistisch programmiert.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm2.Timer4Timer(Sender: TObject);
begin
  if (Image4.Left <= 0or (Image4.Top <= 0then 
    Bewegung := 1
  else if (Image4.Left >= Form1.Width) or (Image4.Top >= Form1.Height) then
    Bewegung := -1;

  Image4.Left := Image4.Left + Bewegung;
  Image4.Top := Image4.Top + Bewegung;
end;

Ist Bewegung positiv, wandert das Bild nach unten links, sonst nach oben rechts. Stößt es oben links an, wird Bewegung positiv, damit es wieder runter geht, und umgekehrt.

Was ihr programmiert habt, kann zu einer Art "Zittern" führen, weil die Richtig ständig umgedreht wird, wenn sich das Bild außerhalb des zulässigen Bereiches befindet, aber mit der "Sprungweite", nämlich Bewegung, nicht mehr in einem "Satz" (Timer-Event) zurückfindet. Meine Lösung dagegen schiebt das Bild strikt in die richtige Richtung.


Waldkauz - Mi 27.05.09 23:31

Jetzt startet Image4 aber gleich in die falsche Richtung und somit aus dem Bild (Image1) hinaus


Yogu - Do 28.05.09 11:16

user profile iconWaldkauz hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt startet Image4 aber gleich in die falsche Richtung und somit aus dem Bild (Image1) hinaus

Dir ist aber schon klar, dass der Code das Bild im Formular, nicht in einem anderen Bild hin- und herbewegt? Du musst die Vergleiche noch entsprechend anpassen.


Waldkauz - Do 28.05.09 13:46

sorry, hatte nmoch 'nen kleinen Tippfehler drin...thx