Pinball-Game / JavaScript: Wie kann ich die Kollisionserkennung implementieren?

1 Antwort

Du hast einen Zeitschritt t.

In diesem Zeitschritt bewegt sich deine Kugel von x(t-1) zu x(t). (Wir vernachlässigen einmal andere bewegte Objekte, wird etwa skomplizierter damit ist aber noch recht ähnlich).

Es entsteht ein Liniensegment zwischen x(t-1) und x(t). Du suchst jetzt Schnittpunkte mit allen deinen Objekten (also mit deren äußeren Hülle). Oder mit allen Objekten in der Nähe des Liniensegmentes.

Wenn du den Schnittpunkt gefunden hast, dann kannst du eine Kollisionsbehandlung durchführen. Wie genau die aussieht hängt davon ab, wie du die implementieren möchtest und ob du nur lineare Geschwindigkeiten hast oder auch anguläre.

Im Grunde musst du aber ein Gleichungssystem lösen, sodass die neuen Geschwindigkeiten gleich sind.
Oder aber du machst das ohne explizit ein Gleichungssystem aufzustellen, siehe dafür auch:

https://en.wikipedia.org/wiki/Collision_response

Auch hilfreich:

https://en.wikipedia.org/wiki/Elastic_collision

https://en.wikipedia.org/wiki/Collision

https://en.wikipedia.org/wiki/Collision_detection

Whataboutno08 
Fragesteller
 12.06.2023, 09:08

Danke dir! Ja, die Grundidee habe ich erstmal verstanden. Ich hätte allerdings gedacht, dass es leichter wäre die Kollisionserkennung mit der Hülle der Css-Elemente zu implementieren (z.B. dass es eine direkte Möglichkeit gibt, sofern der Ball mit zB dem roten Trapez in Berührung kommt einen Richtungswechsel durchführt, je nachdem mit welcher Seite des Trapezes, ändert sich die Laufbahn des Balls entsprechend. Kennst du vielleicht physics Bibliotheken, die für so etwas geeignet sind, oder hättest du eine andere Idee wie man an das Ganze rangehen könnte?

Ein Teil der Playarea sieht zurzeit so aus:

html: https://prnt.sc/36OkEqZzDZVd

css: https://prnt.sc/NOrsIfE-zPI9

0
Destranix  12.06.2023, 10:23
@Whataboutno08

Also man kann an sich, recht kompliziert, schauen, ob sich Elemente im Browserfenster überlappen. Das bringt dir aber eher weniger.

Ich kenne keine Javascript Physics-Bibliotheken. Allzuschwer ist das auch nicht zu implementieren, man kann ja z.b. auch anstatt impulsbasierte Kollision einfach nur die Richtung ändern oder so.

0