![]() |
Ball bewegen mit Timer(Ball=Canvas darstellung)
Hallo Leute,
Erstmal muss ich sagen das ich euer Forum richtig Klasse finde, da ich seit langem hier unterwegs bin mich aber nie regestriert habe. Ich habe mir mal vorgenommen mal ein Pong Spiel zu programmieren, aber da habe ich gleich auch erste Probleme mit dem Ball. Wie kann ich den das ganze so machen, wenn das Spiel gestartet wird, dann soll ein ball auftauchen der hin und her sich bewegt, also vom rand abprallt und von dem schläger usw. Ich weiss net wie ich das realisieren soll. Erste Ansätze habe ich schon versucht, aber das war schon mal ganz schlecht. Hier ist es:
Delphi-Quellcode:
Diese x und y werte sind von der Ellipse die ich erstellt habe. so jetzt meine frage, wie kann ich das so programmiere, das wenn er den rand von der Form berührt die richtung wechselt und das gleiche bei den schlägern?
procedure TForm1.Timer1Timer(Sender: TObject);
begin x2 := x2 + 10; y2 := y2 + 10; x3 := x3 + 10; y3 := y3 + 10; // wenn oben oder unten angekommen dann Richtung wechseln if (y2 <= 0) or (y2 >= Form1.ClientHeight) or (y3 <= 0) or (y3 >= Form1.ClientHeight) then begin y2 := y2-30; y3 := y3-10; end; //wenn rechts oder links angekommen dann Richtung wechseln if (x2 <= 0) or (x2 >= Form1.ClientWidth) or (x3 <= 0) or (x3 >= Form1.ClientWidth) then begin x2 := x2-20; x3 := x3-40; end; end; |
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Zitat:
|
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Zitat:
Ich habe es so gemacht mit den speichern:
Delphi-Quellcode:
Das sind die Variablen, dann habe ich ihm werte zugewiesen, da es ja auch gleichzeitig ne ellipse ist:
x2,y2,x3,y3: Integer;
Delphi-Quellcode:
Das steht bei mir unter FormCreate.
x2 := 250;
y2 := 260; x3 := 270; y3 := 280; Timer1.Enabled := True; und dannach kommt halt die Procedur die ich gepostet habe und jetzt verändert habe:
Delphi-Quellcode:
Ich hoffe das die Infos einigermaßen reichen.
procedure TForm1.Timer1Timer(Sender: TObject);
begin x2 := x2 + 10; y2 := y2 + 10; x3 := x3 + 10; y3 := y3 + 10; // wenn oben oder unten angekommen soll er Richtung wechseln if (y2 <= 0) or (y2 >= Form1.ClientHeight) or (y3 <= 0) or (y3 >= Form1.ClientHeight) then begin y2 := -y2; y3 := -y3; end; //wenn rechts oder links angekommen soll er Richtung Richtung wechseln if (x2 <= 0) or (x2 >= Form1.ClientWidth) or (x3 <= 0) or (x3 >= Form1.ClientWidth) then begin x2 := -x2; x3 := -x3; end; end; Mfg Andy1988 |
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Was sind denn X2, x3, y2, y3? Die Bezeichner sind nicht besonders vielsagend. Wo speicherst du die Geschwindigkeiten?
|
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
X2,y2,x3,y3 das sind die daten der ellipse. Die geschwindigkeit habe ich nirgendswo gespeichert.
|
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Vorschlag:
Zitat:
Zitat:
Zitat:
|
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Zitat:
Woher weis das programm dann das es Ellipse bewegen soll wenn ich für die geschwindigkeit Variable anlege? |
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Bei jedem Timeraufruf erhöhst du einfach die X-Position(en) um die X-Geschwindigkeit, mit Y das gleiche. Dazu müssten neben der/den Position(en) natürlich auch noch die X- und Y-Geschwindigkeiten in Variablen gespeichert werden.
|
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
ja, aber ich sehe nicht in meinem code wo ich das eintragen soll.
EDIT: Ich habe aber doch die geschwindigkeit schon erhöht. Siehe Hier:
Delphi-Quellcode:
Edit2:
procedure TForm1.Timer1Timer(Sender: TObject);
begin x2 := x2 + 10; y2 := y2 + 10; x3 := x3 + 10; y3 := y3 + 10; Was ich aber auch net verstehen kann, wieso kann ich nur sehen das der ball sich bewegt, wenn ich die schläger bewege? Wenn ich sie net bewege, dann sehe ich net das der ball sich bewegt, aber wenn ich wieder drücke, dann sehe ich das er doch ne zeit lang sich bewegt hat, aber ich das net war genommen habe. Edit3: So hab folgendes in mein Code hinzugefügt
Delphi-Quellcode:
if (x2 >= ClientHeight-470) or (x3 >= ClientHeight-470) then begin
x2:= x2+x4; x3:= x3+x4; Repaint; end; if (y2 >= ClientHeight-10) or (y3 >= ClientHeight-10) then begin y2:= y2+y4; y3:= y3+y4; Repaint; end; end; LastStep := gettickcount; end; |
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Wenn ihr wollt, dann kann ich eine .exe einfügen damit ihr sehen könnt was passiert.
|
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Ich glaub eindeutigere Variablenbezeichner helfen den meisten hier mehr... zudem verrät eine .exe nur wenig über den Source
|
Re: Ball bewegen mit Timer(Ball=Canvas darstellung)
Ich glaub worum es geht ist diese procedur:
Delphi-Quellcode:
Ach übrigens die oberen y werte sind von den schlägern.
procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
begin done := false; if Gettickcount-LastStep > 1 then // = <1> Schritte pro millisekunde begin if unten then if y+H < ClientHeight-10 then begin y := y+StepWidth; Repaint; end; if oben then if y >= ClientHeight-470 then begin y := y-StepWidth; Repaint; end; if unten1 then if y1+H < ClientHeight-10 then begin y1 := y1+Stepwidth; Repaint; end; if oben1 then if y1 >= ClientHeight-470 then begin y1 := y1-StepWidth; Repaint; end; if (Ellipsex2 >= ClientHeight-470) or (Ellipsex3 >= ClientHeight-470) then begin Ellipsex2:= Ellipsex2+Geschwx4; Ellipsex3:= Ellipsex3+Geschwx4; Repaint; end; if (Ellipsey2 >= ClientHeight-10) or (Ellipsey3 >= ClientHeight-10) then begin Ellipsey2:= Ellipsey2+Geschwy4; Ellipsey3:= Ellipsey3+Geschwy4; Repaint; end; Ellipsex2 := Ellipsex2 + 3; Ellipsey2 := Ellipsey2 + 3; Ellipsex3 := Ellipsex3 + 3; Ellipsey3 := Ellipsey3 + 3; // wenn oben oder unten angekommen soll er Richtung wechseln if (Ellipsey2 <= 0 ) or (Ellipsey2 >= Form1.ClientHeight) or (Ellipsey3 <= 0 ) or (Ellipsey3 >= Form1.ClientHeight) then begin Ellipsey2 := -Ellipsey2; Ellipsey3 := -Ellipsey3; end; //wenn rechts oder links angekommen soll er Richtung Richtung wechseln if (Ellipsex2 <= 0 ) or (Ellipsex2 >= Form1.ClientWidth) or (Ellipsex3 <= 0 ) or (Ellipsex3 >= Form1.ClientWidth) then begin Ellipsex2 := -Ellipsex2; Ellipsex3 := -Ellipsex3; end; end; LastStep := gettickcount; end; Und hier die Vereinbarung:
Delphi-Quellcode:
const
H = 90; B = 15; StepWidth = 10; Geschwx4 = 3; Geschwy4 = 3; implementation {$R *.dfm} function KeyPressed(Key: Integer): Boolean; begin KeyPressed := (GetAsyncKeyState(Key) and $8000 <> 0); end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnIdle := Idle; x := 30; y := 100; x1 := 500; y1 := 100; doublebuffered := true; Ellipsex2 := 250; Ellipsey2 := 260; Ellipsex3 := 270; Ellipsey3 := 280; Timer1.Enabled := True; end; Ich hoffe das man jetzt mehr rauslesen kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 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 by Thomas Breitkreuz