Autor Beitrag
paderborner
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 16.03.09 17:11 
Hallo,

hab da mal ne Frage: ich bin gerade am schreiben eines Mini-Programmes, wo ein Kreis sich in der Mitte befindet. Diesen kann man durch Buttons in 8 verschiedene Richtungen steuern. Ich habe dort einen Timer eingebaut, damit sich das ganze automatisch bewegt, sobald ich auf einen der Buttons klicke.

Wenn der Kreis nun am z.B linken Enden der Wand angekommen ist, soll er dort aprallen und wieder in die andere Richtung zurück gehen. Doch leider funktioniert das nicht so ganz. Der Kreis geht zwar zur linken Seiten, bleibt dort aber hängen und kommt nicht wieder zurück. Hier der Code für den Timer:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  kreis.left := kreis.Left + x;
  kreis.top := kreis.top + y;
  if kreis.left <0 then kreis.left := x *(-1);
end;

Was kann ich also jetzt machen, dass der Ball wieder zurückkommt?

Mfg
paderborner

Moderiert von user profile iconNarses: B- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mo 16.03.2009 um 16:13
Zorro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76

Win 2000, Win XP Pro
Delphi 7 Architect
BeitragVerfasst: Mo 16.03.09 17:28 
Wenn x positiv ist - wovon ich ausgehe - dann wird (-x) - also x * -1 stets negativ sein.
Darüber hinaus "addierst" du die Gegenrichtung ja nicht, sondern weist sie der Eigenschaft left als direkten Wert zu.

Greetz
Zorro

_________________
Real programmers confuse Xmas and Halloween because DEC 25 = OCT 31
paderborner Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 16.03.09 17:36 
user profile iconZorro hat folgendes geschrieben Zum zitierten Posting springen:
Wenn x positiv ist - wovon ich ausgehe - dann wird (-x) - also x * -1 stets negativ sein.
Darüber hinaus "addierst" du die Gegenrichtung ja nicht, sondern weist sie der Eigenschaft left als direkten Wert zu.
Da geb ich dir Recht. Wie kann ich es dann erreichen, dass der Kreis zurückkommt. Sorry, wenn ich frage: kenn mich mit der ganzen Geschichte jetzt noch nicht so lange aus...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 16.03.09 17:44 
Du musst den Wert von x und y, also den Änderungen umkehren. Wenn du an der Wand angekommen bist, dann muss der Ball das nächste Mal nicht +5 z.B. weiter, sondern +(-5) = -5 weiter, also zurückprallen.

Also ändere nicht den Wert von Left, sondern den der Veränderung in x- bzw. y-Richtung.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 16.03.09 17:48 
Wenn ich deinen Code richtig interpretiere, ist bei dir "x" die Geschwindigkeit in horizontaler Richtung. Wenn du diese Komponente des Geschwindigkeitsvektors umkehrst, erhälst du eine Bewegung in die Gegenrichtung. (das ist das, was jaenicke gesagt hat ;) )
Für solche Fragen könnte man mal einen FAQ-Eintrag machen, das wäre sicherlich gern gesehen ...

Ich weiß jetzt nicht, ob du dich mit dem Thema Vektoren auskennst, aber falls nicht, solltest du dir vielleicht mal ein bisschen Wissen auf Wikipedia anlesen, denn wenn man sich in der Richtung auskennt, hat man beim Thema gesteuerte Bewegung große Vorteile :zustimm:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
paderborner Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 16.03.09 19:18 
Hey!! Cool! Es geht jetzt! Danke für Eure Tipps. Echt! 8) 8)

Mfg
paderborner