Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - reflektierender Ball - Hilfe!
Smokey002 - Sa 10.04.10 15:18
Titel: reflektierender Ball - Hilfe!
hallo
Ich bin ein blutiger Anfänger, nur damit eventuelle Kommentare erspare ;)
ich muss ein kleines Programm schreiben, das dafür sorgt das ein Ball an den Wänden einer Begrenzung (eine weiße quadratische shape) abprallt bzw nach dem Motto "Einfallswinkel=Ausfallswinkel" reflektiert wird.
Im Moment macht der Ball noch nicht das was ich von ihm will.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59:
| unit Uball;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) sgrenze: TShape; sball: TShape; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); private public end;
var Form1: TForm1; bx: Integer; by: integer; implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject); begin bx:=10; by:=20;
sball.left:=sball.left+bx; if sball.left < 0 then begin sball.left := 1; bx := -bx; end; if sball.left > sgrenze.width - sball.left then begin sball.left := sgrenze.width - sball.left; bx := -bx; end;
sball.top := sball.top+by; if sball.top < 0 then begin sball.Top := 1; by := -by; end; if sball.top > sgrenze.height - sball.height then begin sball.top := sgrenze.height - sball.height; by := -by; end;
end; end. |
Ich bräuchte eure Hilfe!
Außerdem würde ich gerne eine dritte Shape als bewegliche Wand einbauen (Mousemove) um ein bisschen mit dem Ball herumzuspielen, weiß aber nicht wie ich das anstelle.
vielen Dank im Vorraus,
Smokey
Moderiert von
Kha: Delphi-Tags hinzugefügt
Jann1k - Sa 10.04.10 16:08
Das Problem ist, dass du im Timer die Werte für bx und by neu setzt. D.h. wenn deine Prozedur erkannt hat, dass der Ball abprallen soll und dx bzw dy entsprechend negiert, kommt vor der nächsten Bewegung dein Timer und setzt bx und by wieder auf die Startwerte.
Das mit der beweglichen Wand: Du kannst im OnMouseMove-Ereignis deiner Form, einfach ein Shape an den Mauszeiger "drankleben" lassen. Dann musst du nur noch im Timer schauen ob der Ball mit dem Shape kollidiert.
Smokey002 - Sa 10.04.10 19:18
hi,
danke für die Hilfe. Der Ball reflektiert jetzt korrekt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78:
| unit Uball;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Timer1: TTimer; Schlaeger: TShape; Pgrenze: TPanel; sball: TShape; BStart: TButton; procedure Timer1Timer(Sender: TObject); procedure BStartClick(Sender: TObject); procedure SchlaegerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); private public end;
var Form1: TForm1; bx: Integer; by: integer; implementation
{$R *.DFM}
procedure TForm1.BStartClick(Sender: TObject); begin bx:=5; by:=5; Timer1.enabled:=true; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin
sball.left:=sball.left+bx; if sball.left < 0 then begin sball.left := 1; bx := -bx; end; if sball.left > pgrenze.width - sball.width then begin sball.left := pgrenze.width - sball.width; bx := -bx; end;
sball.top := sball.top+by; if sball.top < 0 then begin sball.Top := 1; by := -by; end; if sball.top > pgrenze.height - sball.height then begin sball.top := pgrenze.height - sball.height; by := -by; end;
end;
procedure TForm1.SchlaegerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Schlaeger.Left := X - Schlaeger.Width div 2; end;
end. |
Bei dem Mousemove procedure stimmt anscheinend auch etwas nicht. Meine Shape haftet sich sofort an die linke Wand und bewegt sich nur ab und zu mit meiner Maus. Aber auch nur um dann sofort wieder an die linke Wand zu hüpfen.
Wie kann ich einen Schläger programmieren?
Smokey002 - Sa 10.04.10 20:20
ok danke erstmal den Leuten, die mir versucht haben zu helfen :)
habe jetzt den Ball und den Schläger.
Jetzt bräuchte ich noch eine Art Kollisionsabfrage zwischen den Beiden. Wie bewerkstellige ich dies?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!