Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Sinus...oder Pong die 2. (https://www.delphipraxis.net/1413-sinus-oder-pong-die-2-a.html)

Nonsense 23. Nov 2002 21:29


Sinus...oder Pong die 2.
 
Hideliho,
bastel auch ein Pong - gab bis jetzt keine Probleme.
ABER...
Der Ball hat bei Abprallen immer den gleichen Winkel (Ich arbeite mit mit einer X- und Y-Achse sowie die Geschwindikeit für die X- und Y-Achse, welche mit der Funktion Abs negiert werden).
Ich habe hier im Forum was von Sinus etc. gelesen und verstehe es nicht (und kann es deswegen natürlich nicht anwenden...).
Kann mir jemand helfen? Ich würde gerne einen anderen Winkel haben, der aber trotzdem physikalisch "wirkt".
Greetings

:( :( :(

thomasdrewermann 23. Nov 2002 21:51

Heisst das, dass der Ball schräg auf die Bande trifft und dann in eine andere Richtung abgelenkt werden soll?

Dann gilt:
Einfallswinkel=Aussfallswinkel also
Einfallswinkel+180

MFG
Thomas

Nonsense 23. Nov 2002 22:12

Jaja, schon klar.
Aber wie mache ich das mit den Winkeln? Ich habe doch gar keine, nur Koordinaten!?

thomasdrewermann 23. Nov 2002 22:13

Du musst die Koordinaten nacheinander berechenen.
Mit dem Sinussatz.

Nonsense 23. Nov 2002 22:15

???
Ich wäre Code-Beispielen nicht abgeneigt...

thomasdrewermann 23. Nov 2002 23:32

Hier ist das vollständige Pong-Spiel in Delphi:
Pong Download

Hier noch ein Thread zum Thema "Bande":
Blöde Frage, aber kann mir einer PONG programmieren :) ????

CalganX 24. Nov 2002 08:25

Ich denke das Problem liegt beim Sinus, denn so wie ich das sehe, weiß er nicht was das ist (sorry, wenn das nicht so ist)...

Chris

PS: Mir geht's übrigens genauso...

Nonsense 24. Nov 2002 09:01

Liste der Anhänge anzeigen (Anzahl: 1)
Den Code hatte ich schon und den Thread auch gelesen.
Ich glaube ihr versteht meine umständlich gestellte Frage nicht...
Ich hab mal ein Bild gemalt.

Wenn der Winkel immer gleich bleibt, kann sich dadurch kein Spiel entwickeln, da der Ball immer die gleiche Bahn hat. Deshalb dachte ich, man könnte mit dem Sinus bzw. Kosinus den Winkel ändern und einen gewissen Zufallsraum einbauen.

Greetings

Anmerkung: Mir geht es um das Beispiel von d3g wonach dx := vx * round(cos(winkel * Pi / 180) * r) ist. Falls dies mein Problem lösen sollte (zufälliger Winkel), würde ich mich über eine Doku sehr freuen...

Nonsense 24. Nov 2002 16:38

Hideliho,
anscheinend weiß immer noch keiner was ich will... :roll:
Also, mein Problem sieht wie folgend aus:
http://home.pages.at/klasse10-1nackt/Image2.gif

Der Ball hat immer die gleiche Position! Bitte helft!
Was muss ich ändern?

Greetings

Sebastian Nintemann 24. Nov 2002 17:35

Hallo, wie du den richtigen Winkel berechnest weißt du ja, also dürfte es doch kein Problem sein diesen ein bisschen (per random oder sonstwie) zu verändern. Du kannst ja beim Aufprall auf einen deiner Balken überprüfen, an welcher Stelle des Balkens der Ball sich befindet und dann den Winkel zb so angeben, dass der Ball vom linken Teil des Balkens etwas steiler als er eigentlich sollte, vom rechten Teil etwas flacher und in der Mitte so wie du es jetzt hast abprallt. Oder du nutzt einfach, wie schon gesagt die random Funktion:
Code:
winkel := winkel + (random(11)-5); //winkel um +/- 5 variieren
Gruß, Sebastian

Mr_T 24. Nov 2002 20:10

Also ich habe mal ne Variante ohne den Sinus gemacht:
Code:
if (ball.xpos < -2.7) and (ball.xpos > -3.1) and (ball.ypos < spielerrot.pos + 0.9) and (ball.ypos > spielerrot.pos - 0.95)then
begin
if ball.xspeed < 0 then
begin
 if ball.ypos > spielerrot.pos then
 begin
 ball.yspeed := (ball.ypos-spielerrot.pos)*(0.3);
 ball.xspeed := sqrt((0.09 - (ball.yspeed*ball.yspeed)));
 end
 else
 begin
 ball.yspeed := (spielerrot.pos-ball.ypos)*(-0.3);
 ball.xspeed := sqrt((0.09 - (ball.yspeed*ball.yspeed)));
 end;
end;
end
Hierbei stellen die ersten Werte (die bei Ball.xpos getestet werden) den bereich dar, in dem eine Kollision überhaupt stattfinden kann .... die Y - Pos des Balles wird der eines schlägers verglichen ....
Danach erfolgt eine neuberechnung der Ballgeschwindigkeiten, wobei ich dabei immer im bedacht hatte, das die Geschwindigkeit immer 0,3 ist (durch dieses SQRT per Pytagoras auch realisiert).... und: die x-speed ist immer > 0, da die Differenz zwischen Pos(ball) und Pos(Schläger) nie 1 werden kann (wenn sie 1 ist, geht der ball vorbei...)
Ich hoffe, ich ahbe dasnicht zu kompliziert ausgedrückt....

Nonsense 24. Nov 2002 22:19

@Grotesquery:
Nach ein paar Spielereien ( :coder: ) hab sogar ich Mathe-Muffel das mit Sinus und Kosinus hinbekommen...Mein Problem war eher, dass ich eine einfachere Möglichkeit gesucht habe.

@"B.A. Baracus" Mr_T:
Naja, deine Variante scheint mir noch komplizierter...;-) Danke aber trotzdem!

:dancer:
Jo, Thx@all, damit wäre das Problem beseitigt!

Kleine Frage noch am Rande: Kann mir jemand kurz den Sinn und Zweck von KeyPreview erklären?

Thanks + Greetings
Philipp

Mr_T 25. Nov 2002 17:04

Denn will ich meinen Code mal erklären:

Also...
in dieser Zeile
Code:
if (ball.xpos < -2.7) and (ball.xpos > -3.1) and (ball.ypos < spielerrot.pos + 0.9) and (ball.ypos > spielerrot.pos - 0.95)then
begin
Prüfe ich zuerst die Position des Balles. Dabei ist "ball" ein record, in welchem die Integers xpos und ypos stecken, welche die Position des Balles beinhalten. "spielerrot" ist ebenfalls ein Record.... dieser enthält alle Infos über die Position des Roten Spielers (position, punktestand, usw...) ... hier wird also insgesammt geprüft, ob eine Kollision stattfindet (zuerst werden die Ball - Positionen überprüft, ob es überhaupt zu einer Kollision kommen kann und dann teste ich, ob die Ball - Pos im Rahmen der Schlägerpositionen liegt). Sollte dies erledigt sein, geht es hiermit weiter:
Code:
 if ball.ypos > spielerrot.pos then
begin
Hier teste ich, ob der Ball näher "dran" ist, als die Mitte des Schlägers (ich habe den Clone mit Open Gl in 3d gemacht..... alle meine "y-Koordinaten beziehen sich im Programm auf die z-achse, was bedeutet, das ein Größerer z-wert "nächer an der Kamera drann" bedeutet)....
Dieser Test ist notwendig, damit ich
1) weiß, in welche richtung der Ball abprallen soll
2) keine Negativen werte in der Rechnung habe
...
sollte das erfüllt sein, geht es hiermit weiter:
Code:
ball.yspeed := (ball.ypos-spielerrot.pos)*(0.3);
ball.xspeed := sqrt((0.09 - (ball.yspeed*ball.yspeed)));
Dies ist das Kernstück der neuen Geschwindigkeitskalkulation ....
Zunächst errechne ich die Y - Geschwindigkeit... diese errechne ich dadurch, das ich die Distanz zwischen dem Ball und der schlägermitte erreche (kollidiren tun sie ja dennoch) und diese mit der maximalen Geschwindigkeit (0,3) multipliziere....
Im Übrigen ist die Subtraktion der Werte immer >1, da ein Wert, bei dem 1 rauskommen würde bedeuten würde, das der Ball vorbeigeflogen wäre ... :-)
Dieses hat nun eine Konsequenz: je weiter an der Seite des Schlägers der Ball auftrift, umso größer ist auch der Abprallwinkel .... trift man ihn genau in der Mitte geht er genau senkrecht weg....

Nach der Berechnung der Y- Geschwindigkeit handle ich die X- Geschwindihgkeit ab. Da die Gesammtgeschwindigkeit ja genau 0,3 sein soll wende ich Pytagoras sein Dreieck an.... (A hoch 2 = B hoch 2 + C hoch 2);

Dabei ist in meinem Falle "A" die Gesamtrichtung, B ist meine X - Speed und C ist meine Y - Speed.... diese Formel habe ich dann nach "B" umgeformt und bin zum ergebiss gekommen, dass B = Wurzel aus (A hoch 2 + C hoch 2) ... (die Wurzelfunktion ist in Delphi "sqrt")
Damit war die Sache einfach: ich brauchte nur noch von 0,9 (meine Gesamtspeed zum Quadrat) nmeine Y -Speed multipliziert mit sich selber abziehen....

Der Restliche Code bezeiht sioch nur noch auf den anderen Fall (Ball weiter weg als Schläger) ....

Ich hoffe die lange erklärung nützt dir was....

Nonsense 25. Nov 2002 21:37

Jo, danke B.A. für deine Erklärung, jetzt ist vieles klarer geworden...Naja, aber noch nicht alles...
Ich würde mich sehr über eine *.dpr-Datei freuen... :dancer:

Biiiiitttttttttttteeeeeeeeeee!!!!!!!!!!!!!!!


Greetings

Mr_T 26. Nov 2002 14:36

Ich muss dir gestehen: ich persönlich gebe nie gerne Source her .... aber wenn du versprichst, sie keinem weiterzugeben, können wir uns evtl per Privatnachricht darauf einigen...........

Edit:
Ich weiß, das mag nun komisch klingen, aber was meinste mit B.A.???

Chewie 26. Nov 2002 14:55

Zitat:

Zitat von Mr_T
Ich weiß, das mag nun komisch klingen, aber was meinste mit B.A.???

A-Team, Mr. T, B.A.? Klingelt da was?

Mr_T 28. Nov 2002 16:19

Aso *klatsch an Kopf* ja, da klingelt was.... habe ich früher manchmal gesehen die Serie.... hat aber mit meinem Nick nichts zu tun (die Sendung hatte ich schon lange vergessen) ne weiste: den Nick hat mir n Kumpel mal zugeteilt, als ich noch kein I-Net hatte aber dennoch als Member bei seiner Website mitgemacht habe.... hat er aus meinem Nachnamen (ich heiße im Real Life: Wilke [T]rei)abgeleitet ... irgendwie bin ich dann dabei geblieben.......


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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