AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Image bewegen, sleep funktion, wettrennen

Image bewegen, sleep funktion, wettrennen

Offene Frage von "hoika"
Ein Thema von Baerchenv · begonnen am 13. Mai 2019 · letzter Beitrag vom 14. Mai 2019
Antwort Antwort
Baerchenv

Registriert seit: 13. Mai 2019
1 Beiträge
 
#1

Image bewegen, sleep funktion, wettrennen

  Alt 13. Mai 2019, 16:21
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
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: Region Bern CH
276 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Image bewegen, sleep funktion, wettrennen

  Alt 13. Mai 2019, 16:31
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.
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
158 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Image bewegen, sleep funktion, wettrennen

  Alt 14. Mai 2019, 09:09
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: http://www.delphibasics.co.uk/RTL.asp?Name=Randomize

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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (14. Mai 2019 um 09:54 Uhr)
  Mit Zitat antworten Zitat
Schokohase

Registriert seit: 17. Apr 2018
719 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Image bewegen, sleep funktion, wettrennen

  Alt 14. Mai 2019, 09:30
Mit random(5) bekommst du eine Zahl zwischen 0 und 4.
Mit Sleep(x) wartest du x Millisekunden.

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.

Geändert von Schokohase (14. Mai 2019 um 09:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.375 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Image bewegen, sleep funktion, wettrennen

  Alt 14. Mai 2019, 10:04
randomize;
Reicht es nicht randomize nur einmal auszuführen zum Beispiel nach\in FormCreate?

gruss
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
964 Beiträge
 
Delphi 7 Professional
 
#6

AW: Image bewegen, sleep funktion, wettrennen

  Alt 14. Mai 2019, 10:17
Das Sleep benutzt werden muss (ist 'ne Vorgabe), dürfte ein Timer ausscheiden.
Delphi-Quellcode:
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;
Nur als Idee hingedaddelt, keine Ahnung, ob sich dadurch was in zielgerichteter Form ändert.

Geändert von Delphi.Narium (14. Mai 2019 um 11:28 Uhr) Grund: Von Moombas gefundenen Fehler korrigiert. (Hatte ihn per Copy&Paste aus dem Eingangspost "vererbert" ;-))
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.375 Beiträge
 
Delphi 2010 Architect
 
#7

AW: Image bewegen, sleep funktion, wettrennen

  Alt 14. Mai 2019, 10:28
Zitat:
Randomize; // Je nach Delphiversion (insbesondere bei älteren) erforderlich.
// Sollte aber nur einmal aufgerufen werden, daher ins FormCreate verschieben.
Dachte ich mir doch

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
158 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Image bewegen, sleep funktion, wettrennen

  Alt 14. Mai 2019, 11:05
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.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (14. Mai 2019 um 12:20 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
6.912 Beiträge
 
Delphi XE4 Professional
 
#9

AW: Image bewegen, sleep funktion, wettrennen

  Alt 14. Mai 2019, 13:56
Hallo,
Zitat:
Ich bin noch ein Delphi-Anfänger
Dann lese dir mal die Hilfe zu F5/F7/F8/Strg+F5 durch.
Heiko
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf