Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Prism Bild kreisen lassen (https://www.delphipraxis.net/107362-bild-kreisen-lassen.html)

crusor 26. Jan 2008 13:41


Bild kreisen lassen
 
Hi,

ich möchte mit einem Timer ein Bild kreisen lassen, dass es ,wenn es z.B. left= 200 erreicht hat, stopt und sich dann nach unten bewegt usw. . Wie funktioniert dies genau?

Ich habe schon versucht, dass es bei left=200 stopt, aber es funktionierte nicht:
(ich habe einen button, einen timer und ein bild)


procedure TForm1.Button1Click(Sender: TObject);
begin
if button1.caption='Lauf' then begin Timer1.Enabled:=true end

else if image1.left=200 then begin Timer1.enabled:=false end


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if image1.left=40 then Timer1.enabled:=false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.left:=image1.left+10; Timer1.Interval:=1000;


end;



Ich bedanke mich schonmal im vorraus für eure Hilfe.

gruß crusor.

crusor 26. Jan 2008 13:44

(PS: habe turbo delphi 2006, nutze aber auch delphi 7)

lbccaleb 26. Jan 2008 13:46

Re: Bild kreisen lassen
 
hallo und herzlichwillkommen in der dp !!! :dp:

da musst du auf mathe 5 klasse zugreifen und nen bissel mi pi arbeiten und rechnungen aufstellen!!

crusor 26. Jan 2008 13:52

Das Bild muss nicht unbedingt "kreisen", sondern soll sich nach rechts bewegeb, dann nach einer weile runter, dann nach links, dann nach oben und wieder nach rechts.

lbccaleb 26. Jan 2008 13:57

Re: Bild kreisen lassen
 
dann kannst du mit sowas hier arbeiten:
Delphi-Quellcode:
image1.left := image1.left - 1;
das würde immer einen pixel abziehen!!
das ganze kannst du dann noch kontrollieren mit einer if abfrage im timer wie zb so:

Delphi-Quellcode:
if image1.left <= 10 then
// so geht er nach links bis 10 pixel und dann kannst mit einer anderen richtung weiter machen
  begin

  end;
das geht natürlich mit allen richtungen!!

crusor 26. Jan 2008 14:27

Kann man auch das schreiben:
if image1.left => 10 then .... ?

das bild soll sich ja nach rechts bewegen.


gruß crusor

crusor 26. Jan 2008 14:39

ich hab jetzt:

procedure TForm1.Button1Click(Sender: TObject);
begin
if button1.caption='Lauf' then begin Timer1.enabled:=true; button1.Caption:='Lauf stop' end
else if button1.caption='Lauf stop' then Timer1.enabled:=false; button1.caption:='Lauf' end;




procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.left:=image1.Left+10; Timer1.Interval:=1000;
if image1.Left >= 50 then begin image1.Top:=image1.top+10 end
else if image1.Top=50 then begin image1.Left:=image1.left-10 end
else if image1.left<= 50 then begin image1.top:=image1.top-10 end
else if image1.Top = 0 then begin image1.left:=image1.left+10 end


Das funktioniert leider nicht so wie es soll.
Kann mir jemand sagen was der Grund ?
danke im vorraus!

gruß crusor

crusor 26. Jan 2008 15:27

Re: Bild kreisen lassen
 
hallo,

hab das problem soweit gelöst:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
if (button1.caption='Lauf') then begin Timer1.enabled:=true; button1.Caption:='Lauf stop' end
else if button1.caption='Lauf stop' then begin Timer1.enabled:=false;button1.caption:='Lauf' end

end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.left:=image1.Left+10; Timer1.Interval:=400;
if image1.left >= 50 then begin Timer2.enabled:=true; Timer1.enabled:=false end

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
image1.top:=image1.Top+10; Timer2.Interval:=400;
if image1.Top = 50 then begin Timer3.enabled:=true; Timer2.enabled:=false end

end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
image1.left:=image1.left-10; Timer3.Interval:=400;
if image1.Left <= 0 then begin Timer3.enabled:=false; Timer4.Enabled:=true end

end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
image1.Top:=image1.Top-10; Timer3.Interval:=400;
if image1.Top = 0 then begin Timer4.Enabled:=false; Timer1.Enabled:=true end

end;

Wenn ich aber irgendwo anhalte und dann weiterlaufen lasse, bewegt er sich nicht auf derselben stelle weiter.

Kann mir da jemand bitte helfen?

Ich danke für eure Hilfe schonmal im vorraus .

Crazy Ivan 26. Jan 2008 15:45

Re: Bild kreisen lassen
 
das ist weil du mit dem button nur
Delphi-Quellcode:
timer1.enabled:=true;
aufrufst. demzufolge geht das image einen anderen weg

crusor 26. Jan 2008 16:55

Re: Bild kreisen lassen
 
Nun hab ich:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
if button1.caption='Lauf' then begin Timer1.enabled:=true; button1.Caption:='Lauf stop' end
else if (button1.caption='Lauf stop' )and (Timer1.enabled=true) then begin Timer1.enabled:=false;button1.caption:='Lauf' end
else if (button1.caption='Lauf stop') and (Timer2.enabled=true) then begin Timer2.enabled:=false;button1.caption:='Lauf' end
else if (button1.caption='Lauf stop') and (Timer3.enabled=true) then begin Timer3.enabled:=false;button1.caption:='Lauf' end
else if (button1.caption='Lauf stop') and (Timer4.enabled=true) then begin Timer4.enabled:=false;button1.caption:='Lauf' end

end;




procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.left:=image1.Left+10; Timer1.Interval:=400;
if image1.left >= 50 then begin Timer2.enabled:=true; Timer1.enabled:=false end



end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
image1.top:=image1.Top+10; Timer2.Interval:=400;
if image1.Top = 50 then begin Timer3.enabled:=true; Timer2.enabled:=false end

end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
image1.left:=image1.left-10; Timer3.Interval:=400;
if image1.Left <= 0 then begin Timer3.enabled:=false; Timer4.Enabled:=true end

end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
image1.Top:=image1.Top-10; Timer3.Interval:=400;
if image1.Top = 0 then begin Timer4.Enabled:=false; Timer1.Enabled:=true end

end;
Das funktioniert schon besser, aber noch nich perfekt.
Könnt mir jemand sagen was noch fehlt, oder was falsch ist?

danke schonmal

Namenloser 26. Jan 2008 17:16

Re: Bild kreisen lassen
 
Hallo.
Dein ursprünglicher Denkfehler liegt darin, dass du bei Berührung mit dem Rand nur einmal in die andere Richtugn verschiebst.
Beispiel: Das Image berührt das Fenster am linken Rand. Also bewegst du es nach rechts. Dann berührt es den rand aber nicht mehr und es wird wieder nach links bewegt etc...

Durch die vier Timer wird dein Programm unnötig komplex. Ich habe dir mal ein kleines Beispiel geschrieben, das mit nur einem Timer auskommt. Den Bewegungsvektor merkt sich das Programm in einem TPoint. Bei Kollision wird dieser vektor dann angepasst.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Button1: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    bewegung: tpoint;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // timer1.enabled wird umgekehrt, aus True wird False, aus False wird True
  timer1.Enabled := not timer1.Enabled;
  // Prüfen ob Timer läuft und Caption anpassen
  if timer1.Enabled then
    button1.Caption := 'Halt!'
  else
    button1.Caption := 'Lauf!';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // bewegung initialisieren
  bewegung := point(3,3); // 3 nach rechts, 3 nach unten
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Kollision Links
  if image1.Left <=0 then
    bewegung.X := 3;
  // Kollision Rechts
  if image1.Left+image1.Width >= ClientWidth then
    bewegung.X := -3;
  // Kollision Oben
  if image1.Top <=0 then
    bewegung.Y := 3;
  // Kollision Unten
  if image1.Top+image1.height >= ClientHeight then
    bewegung.Y := -3;

  // Bewegung ausführen
  image1.Left := image1.Left+bewegung.X;
  image1.Top := image1.Top+bewegung.Y;
end;
Edit: Bist du sicher, dass du Delphi für .NET verwendest? Das erste Delphi,d as .NET unterstütze war Delphi 8. Du schreibst aber, du benutzt unter anderem Delphi 7.

crusor 26. Jan 2008 17:45

Re: Bild kreisen lassen
 
ist mit BEWEGUNG : image1.left gemeint?

Namenloser 26. Jan 2008 18:32

Re: Bild kreisen lassen
 
"Bewegung" ist eine private Variable. (guck mal unter { Private-Deklarationen }). Die Variable ist vom Typ Delphi-Referenz durchsuchenTPoint, der zwei Werte enthält: X und Y. Damit ist er also gut dafür geeignet, um Bewegungsinformationen darin zu speichern. (Genau das geschieht ja auch). Um das Image zu bewegen, werden dann zu Image1.left Bewegung.X (Horizontale Bewegung) und zu Image1.Top Bewegung.Y (Vertikale Bewegung) hinzuaddiert.

crusor 27. Jan 2008 10:12

Re: Bild kreisen lassen
 
Ich habe das , wie Du oben beschrieben hast, programmiert. Aber das Bild bewegt sich dann schräg nach unten, es soll sich aber im Viereck bewegen (nach rechts, nach unten, usw.).

crusor 27. Jan 2008 15:53

Re: Bild kreisen lassen
 
Ich habe zwei bilder so programmiert:

das eine ( Mond "kreisen" lassen):

Delphi-Quellcode:
procedure TForm1.Button9Click(Sender: TObject);
begin
if Button9.caption='Mond Start' then begin Timer1.enabled:=true; Button9.Caption:='Mond stop' end
else if Button9.caption='Mond stop' then begin Timer1.enabled:=false;Timer2.enabled:=false;Timer3.enabled:=false;Timer4.enabled:=false;Button9.caption:='Mond Start' end

procedure TForm1.Timer1Timer(Sender: TObject);
begin
image12.left:=image12.Left+10; Timer1.Interval:=10;
if image12.left<=895 then begin Timer1.enabled:=true; Timer2.enabled:=false end
end;



procedure TForm1.Timer2Timer(Sender: TObject);
begin
image12.top:=image12.Top+10; Timer2.Interval:=10;
if image12.Top=640 then begin Timer2.enabled:=false;Timer3.enabled:=true end
end;




procedure TForm1.Timer3Timer(Sender: TObject);
begin
image12.left:=image12.left-10; Timer3.Interval:=10;
if image12.Left<=8 then begin Timer3.enabled:=false; Timer4.Enabled:=true end
end;




procedure TForm1.Timer4Timer(Sender: TObject);
begin
image12.Top:=image12.Top-10; Timer4.Interval:=10;
if image12.Top=8 then begin Timer4.Enabled:=false; Timer1.Enabled:=true end
end;
das andere ( Sonne "kreisen" lassen):

Delphi-Quellcode:
procedure TForm1.Button10Click(Sender: TObject);
begin
if button10.caption='Sonne Start' then begin Timer5.enabled:=true; button10.Caption:='Sonne stop' end
else if button10.caption='Sonne stop' then begin Timer5.enabled:=false;Timer6.enabled:=false;Timer7.enabled:=false;Timer8.enabled:=false;button10.caption:='Sonne Start' end ;
 end;

procedure TForm1.Timer5Timer(Sender: TObject);
begin
image1.left:=image1.Left-10; Timer5.Interval:=40;
if image1.left<=8 then begin Timer6.enabled:=true; Timer5.enabled:=false end

end;



procedure TForm1.Timer6Timer(Sender: TObject);
begin
image1.top:=image1.Top+10; Timer6.Interval:=40;
if image1.Top = 640 then begin Timer7.enabled:=true; Timer6.enabled:=false end

end;

procedure TForm1.Timer7Timer(Sender: TObject);
begin
image1.left:=image1.left+10; Timer7.Interval:=40;
if image1.Left >= 895 then begin Timer7.enabled:=false; Timer8.Enabled:=true end

end;

procedure TForm1.Timer8Timer(Sender: TObject);
begin
image1.Top:=image1.Top-10; Timer8.Interval:=40;
if image1.Top = 10 then begin Timer8.Enabled:=false; Timer5.Enabled:=true end

end;
Das mit der Sonne funktioniert, das mit dem Mond aber nicht.
Ich habe keine Ahnung, warum das mit dem Mond (sind ja beide identisch von der programmierung) nicht so funktioniert. :?:

Könnt ihr mir dabei helfen?

ICh sag schonmal DANKE.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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