Autor Beitrag
Ryazor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29



BeitragVerfasst: Sa 14.09.02 09:32 
Hallo ihr Dephi Profis!
Ich bin gaaanz neu in der Materie und möchte gerne ein kleinen Pong Klon programmieren.
Ich hab eigendlich schon alles, außer das "Hauptsächliche".
Ich würde mal gerne wissen, wie man am den Ball immer am Rand abprallen lassen kann.
Muss ich dazu mit Einfallswinkel α und α' arbeiten?
Bitte helft mir, ich möchte auch mal ein großer Programmierer werden :D !
Danke, bis denne!
Ryazor
Ryazor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29



BeitragVerfasst: Sa 14.09.02 09:35 
Huch, das Board hat ja mein "Alpha" gecodet!
Sorry, das sollte eigendlich heißen Einfallswinkel [Alpha] und [Alpha]'.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 14.09.02 13:13 
Hallo Ryazor,

Es gibt in Delphi (zumindest in 6PE) in dem Verzeichnis Demos\earthpng ein fertiges Pong, daß könntest du dir anschauen. Außerdem habe ich auf meiner HP (www.tommie-lie.net) unter Downloads ein eigenes Pong auf oGL-Basis, also ein 3D-Pong geschrieben. Wenn du willst, schicke ich dir auch den Sourcecode.
Aber nun zu der eigentlichen Frage, falls du nicht selbst den Code lesen willst:
Ich gehe davon aus, daß du mit dem Canvas arbeitest, oder zumindest mit den echten Pixelkoordinaten auf dem Bildschirm. D.h. du bewegst den Ball, indem du die Position um 1 erhöhst. Der Ball fängt bei (0;0) (rechts oben) an und geht dann nach links unten, also ist die nächste Position (1;1), dann (2;2) usw. Wenn er jetzt an den Rand kommt, also wenn die Koordinaten größer sind als dein Fenster, wird der Ball zurückgeworfen. Am besten du arbeitest von vornherein mit einem Richtungsvektor, den du zu den Ballkoordinaten addierst.
Mit anderen Worten:
Der Richtungsvektor ist (1;1). Addiert man ihn zu den Ballkoordinaten, fliegt der Ball nach rechts unten. Trifft er auf die Wand, brauchst du nur die entsprechende Achse des Richtungsvektors umzudrehen. Trifft er also auf eine horizontale Wand, ist der Richtungsvektor (1;-1). Addiert man jetzt den Richtungsvektor mit der Ballposition, so fliegt der Ball daraufhin nach rechts-oben, anstatt nach rechts unten - er wurde also zurückgeworfen.
Bei der vertikalen Wand sieht's genauso aus:
Trifft der Ball auf eine solche, drehst du einfach die horizontale Richtung um, also der Richtungsvektor ist daraufhin (-1;-1).
Wenn du jedesmal den Richtungsvektor drehst, wenn der Ball die Wand trifft, dann wird er jedesmal zurückgeworfen.
Wie man mit den Delphi-Grundmitteln so einen Vektor erzeugt, weiß ich nciht, aber es müsste irgendwie mit der Koordinaten-Klasse gehen, die ja eigentlich auch nur ein Array ist.
Oder du nimmst von vornherein GLScene, dann gibt's da ganze in 3D und die Vektor-Rechnung ist in gLScene optimiert und ich weiß auch, wie's dort geht, ich kann dir also helfen.

Tschüß
Thomas

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Do 19.09.02 18:17 
ich hab mich mal länger mit der Pong-Materie beschäftigt, die in erster Linie verdammt komplizierte Mathematik ist(10, 11, 12, 13 Klasse!), mit Hilfe dreier Mathe Lehrer habe ich es dann geschafft, dass die Kogeln korekt von ecken abprallen, auch in 3D(richtiges 3D!!!!!, ein Großer Kasten), aber Aufgrund der schwankenden Rechengeschwindigkeit sind die Bälle jedes 5. Mal einfach durch andere Objekte durchgeflogen :cry: , wenn du willst kann ich dier den Code (2D-Variante)gern schicken, vorrausgesetzt ich find ihn noch :wink:

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Do 19.09.02 18:28 
Hallo Matthias,

Wenn du, wie ich, mit einem Richtungsvektor gearbeitet hsat, brauche ich den Code nicht. Dann weiß ich selbst, wie ich den Ball wieder zurückwerfe, auch im 3dimensionalen Raum. Aber wieso fliegt er durch andere Objekte durch wegen der schwankenden Rechenleitung? die dürfte doch egal sein. Hast du nicht mit dem Progressevent des GLCadencers gearbeitet und die deltaTime-Variable benutzt?
Oder hast du gar nicht mit GLScene gearbeitet?

Tschüß
Thomas

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Fr 20.09.02 16:19 
Ich habe mit GLScene gearbeitet, aber was ich auch versucht hab, ich hab es nicht geschafft, dass die Bewegung immmer mit der gleichen FPS lief, das mit dem GLCadencer hat nauch nicht gefunzt, in 2D-3D gings ja , aber beim richtigen 3D war das mit den Kollisionen ein Chaos!!!

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: So 22.09.02 12:07 
@MathiasH:
Du hast bestimmt für die Bewegung folgende Formel genommen:

NeuePosition = AltePosition + Geschwindigkeitsvektor * DeltaZeit

Stimmt's? Diese ist zwar korrekt, aber für die Kollisionserkennung musst du anders vorgehen, und zwar indem du eine Gerade bildest namens

vec_x = AltePosition + s * Geschwindigkeitsvektor

Dann prüfst du, ob es im Intervall [0,DeltaZeit] für s einen Schnittpunkt dieser Geraden zu einer der Begrenzungsebenen gibt. Wenn ja, musst du an diesem Punkt den Geschwindigkeitsvektor mit Einfallswinkel=Ausfallswinkel (oder bei zu den Koordinatenebenen parallelen Ebenen einfach das Vorzeichen der Komponente umkehren) verändern, und wieder eine Gerade bilden, bis s > DeltaZeit ist. Dann fliegt deine Kugel garantiert durch nichts mehr durch.

Aber ich glaub', du hast recht, das haben wir erst im zwölften Jahrgang gemacht.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.