Ich habe ein Problem mit der AABB-Kollisionsauflösung.
Ich löse AABB-Schnittpunkte auf, indem ich zuerst die X-Achse und dann die Y-Achse auflöse. Dies geschieht, um diesen Fehler zu vermeiden: http://i.stack.imgur.com/NLg4j.png
Die aktuelle Methode funktioniert einwandfrei, wenn sich ein Objekt in den Player bewegt und der Player horizontal verschoben werden muss. Wie Sie im GIF sehen können, drücken die horizontalen Stacheln den Player richtig.
Wenn sich die vertikalen Stacheln in den Player hineinbewegen, wird die X-Achse immer noch zuerst aufgelöst. Dies macht die "Verwendung der Spikes als Aufzug" unmöglich.
Wenn sich der Spieler in die vertikalen Stacheln bewegt (von der Schwerkraft beeinflusst, fällt er hinein), wird er auf die Y-Achse gedrückt, da es anfangs keine Überlappung auf der X-Achse gab.
Ich habe versucht, die in der ersten Antwort dieses Links beschriebene Methode zu verwenden: 2D-Rechteckobjekt-Kollisionserkennung
Die Spikes und sich bewegenden Objekte bewegen sich jedoch, indem ihre Position geändert wird, nicht die Geschwindigkeit, und ich berechne ihre nächste vorhergesagte Position erst, wenn die Update () -Methode aufgerufen wird. Natürlich hat diese Lösung auch nicht funktioniert. :(
Ich muss die AABB-Kollision so lösen, dass beide oben beschriebenen Fälle wie beabsichtigt funktionieren.
Dies ist mein aktueller Kollisionsquellcode: http://pastebin.com/MiCi3nA1
Ich wäre wirklich dankbar, wenn jemand dies untersuchen könnte, da dieser Fehler von Anfang an in der Engine vorhanden war und ich mich bemüht habe, eine gute Lösung zu finden, ohne Erfolg. Dies bringt mich dazu, Nächte damit zu verbringen, mir den Kollisionscode anzuschauen und zu verhindern, dass ich zum "lustigen Teil" komme und die Spiellogik codiere :(
Ich habe versucht, dasselbe Kollisionssystem wie in der XNA AppHub-Plattform-Demo zu implementieren (indem ich die meisten Elemente kopiere und einfüge). Der "springende" Fehler tritt jedoch in meinem Spiel auf, während er in der AppHub-Demo nicht auftritt. [Jumping Bug: http://i.stack.imgur.com/NLg4j.png ]
Zum Springen überprüfe ich, ob der Spieler "onGround" ist und addiere -5 zu Velocity.Y.
Da die Velocity.X des Players höher ist als die Velocity.Y (siehe viertes Feld im Diagramm), wird onGround auf true gesetzt, wenn dies nicht der Fall sein sollte, und der Player springt in die Luft.
Ich glaube, dass dies in der AppHub-Demo nicht der Fall ist, da Velocity.X des Players niemals höher sein wird als Velocity.Y, aber ich kann mich irren.
Ich habe das zuvor gelöst, indem ich zuerst auf der X-Achse, dann auf der Y-Achse aufgelöst habe. Aber das schadet der Kollision mit den Spikes, wie ich oben sagte.