AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild kreisen lassen

Offene Frage von "crusor"
Ein Thema von crusor · begonnen am 26. Jan 2008 · letzter Beitrag vom 27. Jan 2008
Antwort Antwort
Seite 2 von 2     12   
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#11

Re: Bild kreisen lassen

  Alt 26. Jan 2008, 17:16
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.
  Mit Zitat antworten Zitat
crusor

Registriert seit: 25. Jan 2008
26 Beiträge
 
#12

Re: Bild kreisen lassen

  Alt 26. Jan 2008, 17:45
ist mit BEWEGUNG : image1.left gemeint?
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#13

Re: Bild kreisen lassen

  Alt 26. Jan 2008, 18:32
"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.
  Mit Zitat antworten Zitat
crusor

Registriert seit: 25. Jan 2008
26 Beiträge
 
#14

Re: Bild kreisen lassen

  Alt 27. Jan 2008, 10:12
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.).
  Mit Zitat antworten Zitat
crusor

Registriert seit: 25. Jan 2008
26 Beiträge
 
#15

Re: Bild kreisen lassen

  Alt 27. Jan 2008, 15:53
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 stopend
else if Button9.caption='Mond stopthen begin Timer1.enabled:=false;Timer2.enabled:=false;Timer3.enabled:=false;Timer4.enabled:=false;Button9.caption:='Mond Startend

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 stopend
else if button10.caption='Sonne stop'  then begin Timer5.enabled:=false;Timer6.enabled:=false;Timer7.enabled:=false;Timer8.enabled:=false;button10.caption:='Sonne Startend ;
 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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 10:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz