![]() |
reflektierender Ball - Hilfe!
hallo
Ich bin ein blutiger Anfänger, nur damit ich mir 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-Quellcode:
Ich bräuchte eure Hilfe!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 { Private-Deklarationen } public { Public-Deklarationen } 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. 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 |
Re: reflektierender Ball - Hilfe!
Was macht das Programm bisher?
Das Problem könnten die großen Schrittweiten sein. |
Re: reflektierender Ball - Hilfe!
Hast du dir schon mal mein
![]() |
Re: reflektierender Ball - Hilfe!
Zitat:
|
Re: reflektierender Ball - Hilfe!
Das
bx:=10; by:=20; am Anfang der Timerroutine macht Dir natürlich die ganze Reflexion im nächsten Schritt wieder zunichte. Gruß Erich |
Re: reflektierender Ball - Hilfe!
Naja ich hoffe nicht das er alles Kopiert, aber ich finde es imme rfürterlich wenn ich da was von "Shape" lese, und dadie Kollision in dem Sample auch gleich berücksichtigt wird ....
Das zu schnelle bewegen hat übrigens u.U. das ![]() |
Re: reflektierender Ball - Hilfe!
klar hab ich mir schon samples und beispiele angeschaut, nur kopieren will ich eigentlich nicht. Ich würde die Vorgehensweiße gerne selbst nachvollziehen.
Der Ball wird an der linken Wand einwandfrei und auch richtig reflektiert. Sobald er an die untere Wand kommt, bleibt er dort stehen und "zittert" so komisch, als ob er festhängt. Die rechte Wand erreicht der Ball erst gar nicht. Er dreht vorher schon um. Ich weiß einfach nicht was falsch läuft. |
Re: reflektierender Ball - Hilfe!
|
Re: reflektierender Ball - Hilfe!
Zitat:
|
Re: reflektierender Ball - Hilfe!
Liste der Anhänge anzeigen (Anzahl: 1)
Im Moment sieht das ganze so aus. Vielleicht wisst ihr dann was nicht korrekt ist.
--> im Anhang |
Re: reflektierender Ball - Hilfe!
Zitat:
|
Re: reflektierender Ball - Hilfe!
Zitat:
Zitat:
|
Re: reflektierender Ball - Hilfe!
Zitat:
|
Re: reflektierender Ball - Hilfe!
hi,
danke für die Hilfe. Der Ball reflektiert jetzt korrekt.
Delphi-Quellcode:
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 { Private-Deklarationen } public { Public-Deklarationen } 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? |
Re: reflektierender Ball - Hilfe!
Zitat:
|
Re: reflektierender Ball - Hilfe!
Hast du den verlinkten Beitrag gelesen? Dort stand, was sein Fehler war!
Und mir fehlende Hilfsbereitschaft voirzuwesen find ich echt zu Kotzen! |
Re: reflektierender Ball - Hilfe!
Zitat:
|
Re: reflektierender Ball - Hilfe!
Zitat:
Inzwischen hab ich aber gesehen, das Du Beitrag 5 gemeint hast. Nehme daher meinen Vorwurf zurück. Sorry also! |
Re: reflektierender Ball - Hilfe!
Hallo,
hast du das OnMouseover an den Panel-Ereignis gebunden. Wenn es auf dem Form liegt kanns nicht funktionieren |
Re: reflektierender Ball - Hilfe!
Zitat:
|
Re: reflektierender Ball - Hilfe!
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? |
Re: reflektierender Ball - Hilfe!
Hallo,
Zusätzlich zu den Panelgrenzen die Positione x/y des Schlägers mit den x/y Wetenn des Balls vergleichen. |
Re: reflektierender Ball - Hilfe!
Zitat:
:roll: |
Re: reflektierender Ball - Hilfe!
Ich entschuldige mich nun förmlich überhaupt was geschrieben zu haben und überlege meine Moderatoren-Job aufzugeben!
|
Re: reflektierender Ball - Hilfe!
Sorry, da hast du was falsch verstanden. Als ich die Antworten auf deinen Link gelesen habe, habe ich den Drang verspürt, mit dem Kopf auf die Tastatur zu schlagen. Für mich war es eigentlich sofort einleuchtend, worauf der link hinweisen sollte. Wollte eigentlich nicht noch mehr Verwirrung stiften :oops:
|
Re: reflektierender Ball - Hilfe!
Zitat:
mir ist nicht ganz klar wie ich die x/y Position des Schlägers mit denen des Balls vergleichen soll, da sich diese Werte ja andauernd verändern. |
Re: reflektierender Ball - Hilfe!
Ja, dies ist richtig, aber prinzipiell erfolgt der Vergleich wie bei den Raumgrenzen des Panels, halt werden nicht die Panelgrenzen, sondern die des Schlägers als Wertepaar verglichen.
z.B. im Timer folgendes noch hinzufügen, hier kannst du über die .TOP auch noch ggf. einen sich im Raum bewegenden Schläger abfragen, also nicht nur einen Schläger der sich auf der x-Achse verändert.
Delphi-Quellcode:
Dies lässt sich sicherlich noch optimieren, ist aber einmal ein Ansatz.
procedure TForm1.Timer1Timer(Sender: TObject);
begin If ((sball.top+sball.Height >= Schlaeger.Top) and (sball.top <= Schlaeger.Top)) then if (sball.left >= Schlaeger.left-Schlaeger.Width) and (sball.left <= Schlaeger.left+Schlaeger.Width) then by := -by; // und weiter im bereits bestehenden Code |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 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