![]() |
Image bewegen, sleep funktion, wettrennen
Hallo, ich möchte mehrere Images gleichzeitig bewegen. Außerdem sollen sie alle eine zufällige Geschwindigkeit haben, mit der sie dies tun, sodass eins der Images, als erstes "ins Ziel" kommt und die Prozedur dann stoppt. Mein Quelltext sieht folgendermaßen aus:
Delphi-Quellcode:
procedure Tform1.Rennen;
var a,b,c:integer; begin a:=random(5); b:=random(5); c:=random(5); if (Image1.Left<400) and (Image2.left<400) and (Image3.left<400) then repeat Image1.Left:=Image1.Left+1; sleep(a); application.ProcessMessages; Image2.Left:=Image2.Left+1; sleep(b); application.ProcessMessages; Image3.Left:=Image2.Left+1; sleep(c); application.ProcessMessages; until (image1.left>399) or (Image2.Left>=399) or (Image3.Left>=399); end; Ich habe nun das Problem, dass sich, obwohl ich sleep(a)/sleep(b)/sleep(c) benutze, immer alle Images gleichschnell nach vorn bewegen :( Ich bin noch ein Delphi-Anfänger und weiß nicht mehr weiter, deswegen wollte ich mal fragen, ob mir vielleicht jemand weiter helfen kann ... (die Befehle sleep(xy) sowie eine repeat-Schleife muss ich verwenden (ist eine schulaufgabe)) LG, Baerchenv |
AW: Image bewegen, sleep funktion, wettrennen
So wie du das programmiert bewegst du Bild1 und wartest a Millisekunden, dann bewegst du Bild2 und wartest b Millisekunden und am Ende noch Bild3 und wartest c Millisekunden. Die Bilder bewegst du jeweils alle um 1 Pixel.
Eventuell wäre es besser, die Bilder 1,2,3 um a,b,c Pixel zu bewegen (?). Verwende besser einen Timer anstatt eine Schleife bis 399; dann kannst du auch auf application.ProcessMessages; verzichten. |
AW: Image bewegen, sleep funktion, wettrennen
Random nutzt meines Wissens (ewig her das ich es benutzt habe), immer die gleiche Reihenfolge.
Du musst daher Randomize hinzufügen, damit solltest du "echte" Zufallszahlrn erhalten. Siehe hier: ![]() Ich würde an deiner Stelle, wie Michael auch Timer nutzen (je Bild ein Timer, der per random + randomize einen neuen interval bekommt, jedesmal wenn er abläuft).
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Imaging.pngimage; type TForm1 = class(TForm) Timer1: TTimer; Timer2: TTimer; Timer3: TTimer; Image1: TImage; Image2: TImage; Image3: TImage; Button1: TButton; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Timer3Timer(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := True; Timer2.Enabled := True; Timer3.Enabled := True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin randomize; Image1.Left := image1.Left + random(10) + 1; Timer1.Interval := 1 + random(100); if Image1.Left <= Form1.Width - 2 * image1.Width then Timer1.Enabled := True else Timer1.Enabled := False; end; procedure TForm1.Timer2Timer(Sender: TObject); begin randomize; Image2.Left := image2.Left + random(10) + 1; Timer2.Interval := 1 + random(100); if Image2.Left <= Form1.Width - 2 * image2.Width then Timer2.Enabled := True else Timer2.Enabled := False; end; procedure TForm1.Timer3Timer(Sender: TObject); begin randomize; Image3.Left := image3.Left + random(10) + 1; Timer3.Interval := 1 + random(100); if Image3.Left <= Form1.Width - 2 * image3.Width then Timer3.Enabled := True else Timer3.Enabled := False; end; end. |
AW: Image bewegen, sleep funktion, wettrennen
Mit
Delphi-Quellcode:
bekommst du eine Zahl zwischen 0 und 4.
random(5)
Mit
Delphi-Quellcode:
wartest du x Millisekunden.
Sleep(x)
Es ist unerheblich, ob du nun 0 oder 4 Millisekunden wartest, dein Auge ist viel zu träge um da einen Unterschied zu sehen. Alle Images bewegen sich ja gleich um einen Pixel, weil du hintereinander wartest. nehmen wir an a, b und c sind jeweils 1 dann wird jedes Bild alle 3 Millisekunden um 1 Pixel nach rechts verschoben sein. Nehmen wir an a=1, b=2 und c=3, dann wird jedes Bild nach 6 Millisekunden um 1 Pixel nach rechts verschoben sein. |
AW: Image bewegen, sleep funktion, wettrennen
Delphi-Quellcode:
randomize;
Reicht es nicht randomize nur einmal auszuführen zum Beispiel nach\in FormCreate? gruss |
AW: Image bewegen, sleep funktion, wettrennen
Das Sleep benutzt werden muss (ist 'ne Vorgabe), dürfte ein Timer ausscheiden.
Delphi-Quellcode:
Nur als Idee hingedaddelt, keine Ahnung, ob sich dadurch was in zielgerichteter Form ändert.
procedure Tform1.Rennen;
var iSleep : Integer; iRandom : Integer; begin Randomize; // Je nach Delphiversion (insbesondere bei älteren) erforderlich. // Sollte aber nur einmal aufgerufen werden, daher ins FormCreate verschieben. iSleep := 100; // Wertebereich für die Pausen per Sleep, eventuell anpassen. // Die Pausen werden dadurch unterschiedlich lang. iRandom := 5; // Wertebereich für die zufällige Verschiebung der Bilder, eventuell anpassen. // Die Anzahl der Pixel, um die verschoben wird, ändert sich je Schleifendurchlauf und je Bild. if (Image1.Left < 400) and (Image2.left < 400) and (Image3.left < 400) then begin repeat Image1.Left := Image1.Left + Random(iRandom); Image2.Left := Image2.Left + Random(iRandom); Image3.Left := Image3.Left + Random(iRandom); Application.ProcessMessages; Sleep(Random(iSleep)); until (Image1.left >= 399) or (Image2.Left >= 399) or (Image3.Left >= 399); end; end; |
AW: Image bewegen, sleep funktion, wettrennen
Zitat:
gruss |
AW: Image bewegen, sleep funktion, wettrennen
hmm ok, zu lange her das ichs genutzt habe war ja auch nur ein Beispiel.
@Delph.Narium: Du hast einen kleinen Fehler in deinem Beispiel: Image1.Left := Image1.Left + Random(iRandom); Image2.Left := Image2.Left + Random(iRandom); Image3.Left := Image2.Left + Random(iRandom); Das mit der Bedingung der Schleifen Nutzung hatte ich garnicht gesehen. Die Schleifen hatte halt den Nachteil das immer Bild 1 als Erstes bewegt wird (evtl. daher im Vorteil bzw. es könnten mehrere gleichzeitig das Ziel erreichen). Hier mal dasBeispiel von Delphi.Narium etwas erweitert.
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Imaging.pngimage, Vcl.ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Image2: TImage; Image3: TImage; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var iSleep : Integer; iRandom : Integer; sMoveImage : String; begin Image1.Left := 0; // Image2.Left := Image1.Left; //setz die Position der Images zurück um einen neuen Durchlauf starten zu können Image3.Left := Image1.Left; // iSleep := 10; // Wertebereich für die Pausen per Sleep, eventuell anpassen. // Die Pausen werden dadurch unterschiedlich lang. iRandom := 5; // Wertebereich für die zufällige Verschiebung der Bilder, eventuell anpassen. // Die Anzahl der Pixel, um die verschoben wird, ändert sich je Schleifendurchlauf und je Bild. if (Image1.Left < 400) and (Image2.left < 400) and (Image3.left < 400) then begin begin repeat sMoveImage := 'Image' + inttostr(random(3) + 1); //Zufällige Auswahl welches Bild bewegt werden soll. TImage(Form1.FindComponent(sMoveImage)).Left := TImage(Form1.FindComponent(sMoveImage)).Left + Random(iRandom); Application.ProcessMessages; Sleep(Random(iSleep)); until (image1.left>399) or (Image2.Left>=399) or (Image3.Left>=399); end; end; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; // Je nach Delphiversion (insbesondere bei älteren) erforderlich. // Sollte aber nur einmal aufgerufen werden, daher ins FormCreate verschieben. end; end. |
AW: Image bewegen, sleep funktion, wettrennen
Hallo,
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz