Hallo,
Gegeben sei das folgende Beispiel (Es handelt sich hier im Screenshot um 2 direkt aufeinander folgende Frames!):
- Das Blaue Rechteck ist die Spielfigur.
- Das schwarze Viereck ist Teil der Umgebung (also eine Art Stein, Wand o.ä.), durch welche der Spieler nicht hindurchgehen können soll.
- Die Roten Vierecke/Rechtecke sind Rectangles, welche für die Kollisionserkennung benutzt werden. Die Spielfigur besitzt 4 Rectangles (oben, unten, rechts, links) und das schwarze Viereck nur 1 Rectangle, welcher von der Größe her identisch mit dem schwarzen Viereck an sich ist.
Bei der Spielfigur werden die 4 Rectangles in folgender Reihenfolge geprüft:
- Prüfung auf Kollision an der linken Seite der Spielfigur
- Prüfung auf Kollision an der rechten Seite der Spielfigur
- Prüfung auf Kollision an der oberen Seite der Spielfigur
- Prüfung auf Kollision an der unterenSeite der Spielfigur
Mein Problem ist nun der Fall, wie er auf dem Screenshot zu sehen ist. Die Kollisionserkennung funktioniert nicht richtig, wenn die Spielfigur von einer schrägen Richtung das den schwarzen Block knallt, da sich hier nun das linke und das untere Rectangle der Spielfigur im schwarzen Block befinden und mit diesem "kollidieren". Das Problem hierbei ist nun wie ich feststellen soll, ob die Figur sozusagen von der rechten Seite des schwarzen Blocks mit dem Block kollidierte oder zuerst von oben? Das muss ich ja deshalb wissen, um die Spielfigur entsprechend entweder oben auf den schwarzen Block positionieren zu können oder eben rechts neben dem Block.
Aber selbst wenn ich dies wüsste: Was wäre für den Fall, falls die Spielfigur mit dem linken und unteren Rectangle gleichzeitg im selben Spieltick/Spielupdate das schwarze Viereck betritt? Was dann?
Das Problem tritt besonders dann häufig auf, wenn die Anzahl der Pixel, mit der sich die Spielfigur pro Spieltick/Spielupdate fortbewegt, größer ist, als die Breite bzw. Höhe der Rectangles der Spielfigur.
Meine einzige Idee ist gewesen zu sagen, dass man die Spielfigur nur maximal mit der Breite bzw. Höhe der Rectangles der Spielfigur bewegt pro Spieltick/Spielupdate. Aber was, wenn mir diese Bewegung dann zu langsam ist? Spieltick/Spielupdates pro Sekunde erhöhen? Derzeit habe ich 60 Spieltick/Spielupdates pro Sekunde und 60 FPS. Würde ich erstere erhöhen/verringern, dann hätte ich ja sozusagen kein Async aktiviert, was ich aber aktiviert haben möchte, um Tearing zu vermeiden.
Kann jemand helfen?
Ist meine Kollisionserkennung generell komplett falsch?
Gegeben sei das folgende Beispiel (Es handelt sich hier im Screenshot um 2 direkt aufeinander folgende Frames!):
- Das Blaue Rechteck ist die Spielfigur.
- Das schwarze Viereck ist Teil der Umgebung (also eine Art Stein, Wand o.ä.), durch welche der Spieler nicht hindurchgehen können soll.
- Die Roten Vierecke/Rechtecke sind Rectangles, welche für die Kollisionserkennung benutzt werden. Die Spielfigur besitzt 4 Rectangles (oben, unten, rechts, links) und das schwarze Viereck nur 1 Rectangle, welcher von der Größe her identisch mit dem schwarzen Viereck an sich ist.
Bei der Spielfigur werden die 4 Rectangles in folgender Reihenfolge geprüft:
- Prüfung auf Kollision an der linken Seite der Spielfigur
- Prüfung auf Kollision an der rechten Seite der Spielfigur
- Prüfung auf Kollision an der oberen Seite der Spielfigur
- Prüfung auf Kollision an der unterenSeite der Spielfigur
Mein Problem ist nun der Fall, wie er auf dem Screenshot zu sehen ist. Die Kollisionserkennung funktioniert nicht richtig, wenn die Spielfigur von einer schrägen Richtung das den schwarzen Block knallt, da sich hier nun das linke und das untere Rectangle der Spielfigur im schwarzen Block befinden und mit diesem "kollidieren". Das Problem hierbei ist nun wie ich feststellen soll, ob die Figur sozusagen von der rechten Seite des schwarzen Blocks mit dem Block kollidierte oder zuerst von oben? Das muss ich ja deshalb wissen, um die Spielfigur entsprechend entweder oben auf den schwarzen Block positionieren zu können oder eben rechts neben dem Block.
Aber selbst wenn ich dies wüsste: Was wäre für den Fall, falls die Spielfigur mit dem linken und unteren Rectangle gleichzeitg im selben Spieltick/Spielupdate das schwarze Viereck betritt? Was dann?
Das Problem tritt besonders dann häufig auf, wenn die Anzahl der Pixel, mit der sich die Spielfigur pro Spieltick/Spielupdate fortbewegt, größer ist, als die Breite bzw. Höhe der Rectangles der Spielfigur.
Meine einzige Idee ist gewesen zu sagen, dass man die Spielfigur nur maximal mit der Breite bzw. Höhe der Rectangles der Spielfigur bewegt pro Spieltick/Spielupdate. Aber was, wenn mir diese Bewegung dann zu langsam ist? Spieltick/Spielupdates pro Sekunde erhöhen? Derzeit habe ich 60 Spieltick/Spielupdates pro Sekunde und 60 FPS. Würde ich erstere erhöhen/verringern, dann hätte ich ja sozusagen kein Async aktiviert, was ich aber aktiviert haben möchte, um Tearing zu vermeiden.
Kann jemand helfen?
Ist meine Kollisionserkennung generell komplett falsch?