Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

26.05.2014, 12:54

Kollision über 2 Frames sinnvoll?

Das Spiel, an dem ich derzeit arbeite, ist jetzt schon in einem weitem Status, eines der Probleme ist noch die Kollision von bestimmten Objekten.


Gegeben sei ein Rechteck, auf das mit verschiedensten Projektilen aus jedem Winkel geschossen werden kann.

Logischerweise nehme ich die 4 Punkte des Rechtecks für die Kollision.
Bei den Projektilen dachte ich mir, ich nehme den Punkt, welcher zuerst auftrift. Fliegt es zB in einem 90° Winkel nach oben, ist es der oberste Punkt und so weiter.

Es gibt einige sehr schnelle Projektile und ich befürchte, dass bei einer längeren Session auch mal die Framerate in den Keller geht, deswegen habe ich mir folgende Methode ausgedacht.

Es wird die Position des Projektil-Kollisionspunkts im letzen und aktuellen Frame gespeichert.
Im letzen Frame kann das Projektil noch nicht getroffen haben, sonst wäre es ja schon eingeschlagen.
Der aktuelle Punkt kann im Rechteck oder schon ausserhalb liegen.
Nun wird berechnet, ob die Flugbahn des Pojektils in/durch das Rechteck ging und wenn ja, kam es zu Kollision, wenn nicht nicht.



Aktuell sind die Rechteck meistens ziemlich klein, also unter Tilegrösse(25x25). Deswegen und falls ein Projektil nur die Ecke des Rechtecks berühren würde, denke ich, dass es nicht reicht die aktuelle Frameposition zu berücksichtigen.

Ist meine Methode sinnvoll, oder mache ich mir zu viele Sorgen und sie ist einfach unnötig?
Bevor ich jetzt einen grossen Algorithgmus dafür entwickle, würde ich die Frage hier gerne stellen :)


Ich hoffe ihr versteht was ich meine und könnt mir helfen.

Dickes Danke schonmal in voraus 8)

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

26.05.2014, 13:21

Den Effekt, den du hier vermeiden willst, nennt man "Tunneling".

Grundsätzlich ist es nicht unsinnig, sich darüber Gedanken zu machen. Wenn die Performance am Ende nicht dagegen spricht, dann steht nur noch der Implementierungsaufwand im Weg.
Alternativ könntest du auch gucken, ob nicht auch auf andere Weise bereits einem Tunneling vorgebeugt werden könnte. Müssen die Rechtecke, die getroffen werden können, so klein sein? Wie schnell sollen sich die Projektile denn letztendlich bewegen und kann die Geschwindigkeit nicht geringer sein?

Wichtig ist aber, wofür du das umsetzen willst. Wenn es in irgendeiner Weise sein könnte, dass mehrere Spiele sich anhand ihrer Ergebnisse im Spiel miteinander vergleichen wollen ((Online)-Highscores, Multiplayer, ...) - und darauf ein gewisser Fokus seitens des Spiels besteht -, dann solltest du auch eine entsprechende Kollisionsprüfung einbauen. Sollte das Tunneling dazu führen können, dass das Spiel nicht mehr funktioniert, solltest du auch bei anderen Spielen nach Möglichkeit diese Prüfung einbauen.

"Raycast" sollte als Suchbegriff interessant sein.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

3

26.05.2014, 14:26

Also ich mache das seit jahren so dass ich die Kollision über den Schnittpunkt einer Linie zwischen letzter und aktueller Position bestimme, bis jetzt hat das immer recht gut funktioniert

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

4

26.05.2014, 20:04

Wenn ich dich richtig verstanden habe, lautet das Stichwort:
Continuous Collision Detection (CCD)

Werbeanzeige