Autor |
Beitrag |
hui1991
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Do 04.01.07 18:36
Hallo,
wie kann ich eine Gute Kollision erreichen wo der Winkel gut berechnet wird.
Weil wenn ein Ball genau mittig auf eine Spitze fliegt, geht es von der wo es kam wieder raus.
Wenn es ein wenig nach links oder rechts ist, dann fliegt der Ball wieder anders.
Wie kann ich das am besten machen.
Hab mir gedacht. An dem Winkel wo die Kolision stattfindet hat ein weiteren Winkel wie das auf die Nächste Seite rausfliegt.
Was sagt ihr dazu?
MfG
hui1991
Moderiert von Christian S.: Topic aus Sonstiges (Delphi) verschoben am Do 04.01.2007 um 17:38
Zuletzt bearbeitet von hui1991 am So 07.01.07 15:29, insgesamt 1-mal bearbeitet
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Do 04.01.07 19:09
Du musst die "Richtung" in die der Punkt mit dem die Kugel kollidiert wissen. Wenn du die Richtung hast, kannste einfach den Winkel berechnen und dann einfach das Vorzeichen umdrehen um die neue Richtung zu kriegen.
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Do 04.01.07 19:32
Ball auf Spitze?  Da geht der Ball in der Regel kaputt.
Bei Ball auf Wand ist Eintrittswinkel gleich Austrittswinkel.
Gilt auch für Ball auf Boden. Wobei die Flugbahn des Balls - wenn man von oben auf den Boden schaut - eine Linie bildet.
Letzteres gilt für Ball auf Spitze nicht. Das stelle ich mir ähnlich kompliziert vor, wie Ball auf Kugel. Dabei spielt dann nicht mehr nur das Abprallen eine Rolle, sondern auch die Ablenkung, die der Ball erfährt, wenn er die Kugel "seitlich" trifft.
Schwierige Sache das.
Besonders, da noch von einem fliegenden Ball die Rede ist und damit die Geschichte zu 3D mutiert.
Kollidierende , rollende Billiardkugeln sind eigentlich schon schwer genug zu berechnen - und die sind nur 2D, berühren sich also immer an ihren Äquatoren und bleiben "auf dem Teppich". (Nein! Kunststöße sind nicht erlaubt.  )
Ich würde mich da nicht rantrauen ...
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Do 04.01.07 20:06
Das ist 2D, habe ich vergessen zu sagen und zu spitzen habe ich noch was
Im Anhang hab ich die spitzen drin.
Und der ball soll nicht kaputt gehen.
Das Fliegen sollte bewegen heißen.
Da ist nix mit 3D.
Das wird ein 2D Pong, blos viel heftiger
Wenn der ball direkt auf die Spitze trifft, dann dann müsste er wieder dort hin rollen, wo er her kam.
Blos wie schaffe ich es das er genau Mittig drauf fliegt.
Das ist schon schwierig
Was ich mir gedacht hab, das ich auf kleinen Kugel, die Kolisionen ausreche, wo alles eine stattfindet und sobald eine gefunden wird weis ich auf welchem Grad die Kugel (kreis) den Gegenstand triff.
Woher weis ich jetzt auf welchem Grad der Kreis jetzt mit einem Gegenstand trifft?
Da dieses Pong zu 8 sein soll (die CPU's sind schon Programmiert, so ein wenig)
Wenn ich den Ball hinkriege, habe ich ein funktionierendes Spiel.
Es gibt 1 Boden, 1 Kugel, 8 Schläger.
Da habe ich ein kleines Problem damit  (mit der Kugel/Ball/Kreis)
MfG
hui1991
Der Bereich ist ein Achteck
Einloggen, um Attachments anzusehen!
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Do 04.01.07 20:42
Die Spitzen sind also die Schläger?
Das sind aber mächtig spitze Spitzen. Da wird der Ball doch meistens nur in Richtung der Bande zwischen den Spitzen abgelenkt und von dort ins Feld zurückprallen (oder aber ins Aus gehen?).
Sollte der Ball sich wirklich mal irgendwo in der Mitte des Spielfeldes befinden und auf einen Schläger (Spitze) zurollen, so wird der ihn aufgrund des spitzen Winkels seiner Spitze kaum ins Feld zurückbefördern können.
hui1991 hat folgendes geschrieben: | Wenn der ball direkt auf die Spitze trifft, dann dann müsste er wieder dort hin rollen, wo er her kam.Blos wie schaffe ich es das er genau Mittig drauf fliegt.
Das ist schon schwierig  |
Was heißt: "Wie schaffe ich das"? Du meinst, wie du das erkennst?
Das ist genau dann der Fall, wenn die Kugel genau auf der Winkelhalbierenden der Spitze angeflogen kommt. In jedem anderen Fall, wird die Kugel nicht haargenau zurückgeworfen, sondern abgelenkt.
Wenn der Schläger von der Kugel genau auf seiner Spitze getroffen wird, dann musst du berechnen, in welchem Winkel zur Winkelhalbierenden der Spitze die Kugel angeflogen kommt. Im selben Winkel fliegt sie auf der anderen Seite der Winkelhalbierenden zurück ins Feld.
Wenn der Schläger von der Kugel an seinen Seiten getroffen wird, so gilt "Ball gegen Wand" und der Einfallwinkel zwischen 'Anflugschneise' und Schlägerwand ist auch gleich Austrittwinkel.
Wie du entscheidest, ob eher die Spitze oder die Seitenwand des Schlägers von der Kugel getroffen wurde, weiß ich auch nicht. Zudem gibt es dort sicher "Zwischenbereiche", bei denen die Kugel weder dem einen, noch dem anderen hier eben beschriebenen Abflugwinkel folgt.
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Do 04.01.07 22:58
Naja nochein anlauf, jetzt mach ich ein Screen, wie weit ich schon bin, blos der Ball fehlt.
Hoffe ihr wisst wie ich das meine.
Könnte ich ein beispiel von einer Mathematischen Rechnung haben.
Wie ich das am besten errechnen könnte?
So nochmal, denke ich habe die richtigen Wörter gefunden.
Die 8 Spitzen sind die Wände
Die 8 Schläger sind Spieler (in Moment 7 CPU und 1 Spieler)
Es soll einen Ball geben, wo ich nicht weis wie ich ihn berechnen soll.
Hoffe ich hab es jetzt richtig gesagt ^^
MfG
hui1991
Einloggen, um Attachments anzusehen!
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Do 04.01.07 23:41
Manchmal glaube ich wirklich, ich spinne ...
Ist es so schwer, gleich zu anfang zu sagen:
"Ich baue ein Pong. Aber nicht wie man es kennt mit 2 Seiten und 2 Spielern, sondern mit 8 Seiten und 8 Spielern. Gespielt wird auf einem Achteck. Jedem Spieler gehört eine Seite, wo er seinen Schläger hat. An den Ecken des Spielfeldes ragen 8 Spitzen ins Feld hinein (siehe Zeichnung), zwischen denen sich die Schläger bewegen."
Dann vergiss mein Posting von vorhin und nimm meine theoretischen Überlegungen jetzt hier nochmal mit. Ich schreibe sie nochmal neu, ohne noch länger anzunehmen, die Spitzen seien die Schläger.
hui1991 hat folgendes geschrieben: | Wenn der ball direkt auf die Spitze trifft, dann dann müsste er wieder dort hin rollen, wo er her kam.Blos wie schaffe ich es das er genau Mittig drauf fliegt.
Das ist schon schwierig  |
Was heißt: "Wie schaffe ich das"? Du meinst, wie du erkennst, dass der Ball direkt auf die Spitze trifft?
Das ist genau dann der Fall, wenn die Kugel genau auf der Winkelhalbierenden der Spitze angerollt kommt. In jedem anderen Fall, wird die Kugel nicht haargenau zurückgeworfen, sondern abgelenkt und schräg ins Feld zurückgeworfen oder sie prallt ab in Richtung einer Spielerbande.
Wenn diese Spitze von der Kugel genau auf ihrer Spitze (was'n Satz) getroffen wird, dann musst du berechnen, in welchem Winkel zur Winkelhalbierenden der Spitze die Kugel angeflogen kommt. Im selben Winkel fliegt sie auf der anderen Seite der Winkelhalbierenden zurück ins Feld. Das gilt allerdings nur, wenn sie von irgendwo aus dem Feld kommt und die Spitze trifft. Wenn sie "von hinten", also von einem Schläger kommt, dann verhält sich das schon wieder ganz anders.
Wenn die Spitze von der Kugel an einer ihrer Seiten getroffen wird, so gilt "Ball gegen Wand" und der Einfallwinkel zwischen 'Anflugschneise' und Spitzenwand ist auch gleich Austrittwinkel.
Wie du entscheidest, ob eher die Spitze oder die Seitenwand der Spitze von der Kugel getroffen wurde, weiß ich auch nicht. Zudem gibt es dort sicher "Zwischenbereiche", bei denen die Kugel weder dem einen, noch dem anderen hier eben beschriebenen Abflugwinkel folgt.
Gleiches gilt übrigens für die Ecken der Schläger.
Zur Berechnung solcher Kollisionen wirst du um die Formeln und Funktionen der Trigonometrie nicht herumkommen.
Soweit zum theoretischen (sicherlich unvollständigen) Ausflug in die Welt eines Pong-Spiels. Bevor die große Winkelrechnerei beginnt, würde ich vorschlagen, machst du erstmal nahezu das komplette Spiel fertig. Sich bewegende Schläger, ein Ball der hinundher rollt und Kollisionsabfragen für den Ball. Bei festgestellter Kollision lässt du den Ball zunächst erstmal in einem zufälligen Winkel wieder wegrollen.
Erst wenn das alles fertig ist, solltest du die Teile hinter der Kollisionsabfrage "richtig" ausprogrammieren, die errechnen, wo genau die Kugel welches Teil getroffen hat und in welche Richtung die Kugel jetzt weiterrollen muss.
So würde ich es machen.
Im Übrigen würde ich suchen (hier im Forum (z.B. KOLLISIONSABFRAGE), in anderen Foren, Google, etc.), ob schon jemand anderes interessante Teile beschrieben hat. Pong ist ja schließlich ein beliebtes Do-it-yourself-Spiel, wie es den Anschein hat. (Nein, ich habe nie eines programmiert.)
Beispiele und Erklärungen zur Geo- und Trigonometrie kriegst du im Netz genügend. Die muss dir hier niemand aufschreiben.
Wenn du soweit bist, dann stelle gerne wieder spezielle Fragen zu speziellen Problemen innerhalb deines speziellen Programmes. 
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: So 07.01.07 01:21
Das Bedeutet so viel wie, dass ich es ins Sand setzen kann...
Ist alles so schwer
mfg
hui1991
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: So 07.01.07 14:48
Hallo hui1991,
wirf doch die Flinte nicht so schnell ins Korn.
Mach es wie IngoD7 gesagt hat. Schritt für Schritt.
a) Bewegung der Schläger jewils links bzw rechts entlang einer Geraden. Hilfreicher Begriff für Geradenbestimmung: Punkt Richtungsgleichung
b) Bewegung des Balls. Richtung über einen zweidimensionalem Vektor.
c) wenn a) und b) gemacht Kollision an den Schläger
d) wenn a), b) und c) klappen Kollision an den Spitzen eventuell statt spitzen Kreis(teile) nehmen. Dort ist Kollisions und FlugbahnBerechnung meines erachtens einfacher
|
|
Corpsman
      
Beiträge: 228
KUbuntu 10.4
Lazarus
|
Verfasst: So 07.01.07 15:35
Zum Thema Ball Collision kan ich euch acuh noch auf
dieses
Sample verweisen.
_________________ --
Just Try it.
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: So 07.01.07 15:38
Also,
ich habe a) schon vor der Fragenstellung gemacht.
Die Verschiebung ist immer 114 Pixel
Die Berechnung habe ich dann auch herausgefunden.
Die Schläger Orentieren sich in Moment an der Maus, da kein Ball vorhanden ist.
Jetzt ist das PRoblem.
Ich kann zwar ein Ball auf die Fläche setzen.
Blos ich weis nicht wie ich ihn in gang Setzen kann.
WIe brechne ich das wenn ich den Winkel 32 habe, das er auch im Winkel 32 fliegt?
Was meinst du mit "Richtung über einen zweidimensionalem Vektor".
Naja leider sind meine Ferien wieder zuende, d. h. ich hab wieder eine Woche Stress und kann warscheinlich am Wochende wieder was machen. Brauch nur die Formel zum Bewegen des Balls in einer Richtung.
Ich hatte schon sowas, blos hab die Formel verschlamppert.
Und auswendig weis ich das nicht.
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: So 07.01.07 16:58
Alle Bewegungen in 2D lassen sich in eine vertikale und eine horizontale Komponete zerlegen.
Die Winkelbewegung kannst Du nur annäherd darstellen. Am besten ist es die Koordinaten des Balles in real oder double Variablen zu speichern und erst beim Anzeigen auf der Fläche zu integer umwandeln.
Wenn Du die Position des Balles hats kannst Du mit Hilfe des Winkels die Richtungskomponten errechnen.
Dazu eine Grafik im Anhang.
Die Berechnung ist Trigonometrie
Einloggen, um Attachments anzusehen!
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: So 07.01.07 17:43
Also wenn dann ein Ball in einem Winkel von 189° fliegt.
Muss pro Distanz_Pixel (Keine Ahnung wie ich das nennen soll)
X um 0.156 vermindert werden
Y um 0.988 vermindert werden
In delphi würde es dann so aussehen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TFOrm1.ballbewegen(var Winkel: Integer; const Distanz: Extended = 1); begin Ball.x:=Ball.x+(cos(Winkel)*Distanz); Ball.y:=Ball.y+(sin(Winkel)*Distanz); end; |
So habe ich das jetzt nach dem Java Applet von Wikipedia Verlinkten Seite verstanden.
So würde des auch sinn machen.
Denke die beiden Funktionen sind in der Math unit.
Aber das reinprogrammieren mache ich dann, wenn ich zeit habe.
Habe den Code nichtmal getestet.
Ich hab bei mir schon eine TBall classe erstellt, damit ich das getrennt habe.
In TBall sind dann x, y, winkel drin und eine procedure um ihn zu bewegen angefangen.
Eine Collisionsüberprüfung ist da auch schon vorbereitet.
Aber leider nicht mit funktion.
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: So 07.01.07 19:55
Ein Hinweis an dieser Stelle: Delphi rechnet mit RAD. Es ist hilfreich den Winkel daher gleich in RAD zu haben.
Vollkreis in DEG 360°, in RAD 2Pi
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: So 07.01.07 20:45
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: So 07.01.07 23:37
Um Verwirrung zu vermeiden, hier ein Auszug aus der DelphiHilfe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| Delphi-Syntax:
function Sin(X: Extended): Extended;
Beschreibung
In Delphi gibt Sin den Sinuns des Arguments zurück. X ist ein Ausdruck des Typs Real. Sin gibt den Sinus des mit X angegebenen Winkels im Bogenmaß (Rad) zurück. |
Im Alltag verwendet man oft Gradmaß.
Ist eine nicht seltene Fehlerquelle.
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Mo 08.01.07 07:59
Sorry, ich weis, aber immernochnicht was mit RAD gemeind ist
Hab nur lauter  überm
MfG
hui1991
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Mo 08.01.07 10:19
RAD bedeutet das cos(2pi)=1
DEG bedeutet das cos(360°)=1
2Pi in RAD entsprechen 360° in DEG.
Deutlicher kann ich es bald nicht mehr vermitteln
Delphi rechnet im Bogenmaß. RAD steht für Bogenmaß.
Hast Du einen Taschenrechner mit ? Dann guckt doch bitte mal in selbige unter Trigonometrische Berechnungen.
|
|
hui1991 
      
Beiträge: 433
Windows XP, WIndows Vista
Turbo Delphi Explorer| Delphi, PHP,Blitzbasic
|
Verfasst: Mo 08.01.07 16:22
|
|
Tilo
      
Beiträge: 1098
Erhaltene Danke: 13
Win7 geg. WInXP oder sogar Win98
Rad2007
|
Verfasst: Mo 08.01.07 16:29
Frage:
Bewegt sich schon was?
|
|