Sidescroller variable Geländehöhenkarte für Gehen / Kollision

7

Ich habe mit dem Bewegen von geneigten Kacheln in XNA herumgespielt und es funktioniert halb, ist aber nicht ganz zufriedenstellend. Ich habe auch gedacht, dass Sätze von vorgegebenen Hängen mir möglicherweise kein Terrain geben, das "organisch" genug aussieht. Es besteht auch das Problem, dass für jede Neigung mehrere verschiedene Fliesentypen konstruiert werden müssen, wenn sie miteinander verkettet sind (nur 45-Grad-Fliesen werden nach meinem Verständnis perfekt verkettet).

Ich hatte daran gedacht, nach verbundenen Ketten von geneigten Fliesen zu suchen und sie als neues großes Dreieck zu behandeln, da ich Probleme hatte, an den Rändern, an denen sich geneigte Fliesen verbinden, Störungen zu verursachen. Dies führt jedoch zurück zu dem Problem der Begrenzung der Krümmung des Geländes.

Also ... ich möchte jetzt ein einfaches Bild oder eine Textur des Geländes eines Levels (oder eines Abschnitts des Levels) erstellen und eine einfache Höhenkarte (der Ys für jedes X) für das Terrain erstellen. Die Y-Position des Spielers wird dann nur basierend auf seiner X-Position aktualisiert.

Gibt es eine einfache Möglichkeit, dies zu tun (oder eine bessere Möglichkeit, dieses Problem zu lösen)? Das Hauptproblem, das ich bei dieser Methode sehen kann, ist der Fall, in dem sich Bereiche über dem Boden befinden, auf denen man laufen kann. Vielleicht gibt es eine Möglichkeit, einfach alle begehbaren Bodenbereiche abzubilden?

Ich habe mir diesen hilfreichen Code angesehen: http://thirdpartyninjas.com/blog/2010/07/28/sloped-platform-collision/, aber ich brauche eine Möglichkeit, die tatsächlichen Punkte / Vektoren zu generieren.

BEARBEITEN: Ich habe versucht, geneigte Pfade mithilfe des von mir geposteten Links vorab zu generieren, aber jetzt bin ich überzeugt, dass ich die von Ihnen vorgeschlagene Kollision pro Pixel verwenden sollte. Ich habe mir das Beispiel unter http://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel angesehen und versuche herauszufinden, wie das Sprite angepasst werden kann, sobald eine Kollision erkannt wurde. Wie David vorgeschlagen hat, habe ich einige Sensorpunkte (Füße, Seiten, untere Mitte usw.) erstellt und kann leicht erkennen, wann diese Punkte tatsächlich mit nicht transparenten Teilen einer zweiten Textur kollidieren (einfache Neigung). Ich habe Probleme mit dem Algorithmus, wie ich die Sprite-Position basierend auf einer Kollision anpassen würde.

Angenommen, ich erkenne eine Kollision mit der Neigung am rechten Fuß des Sprites. Wie kann ich die Hangtexturdaten scannen, um die Y-Position zu finden, um den Fuß des Sprites so zu platzieren, dass er sich nicht mehr innerhalb des Hang befindet? Die Art und Weise, wie es im Beispiel als 1D-Array gespeichert wird, ist etwas verwirrend. Sollte ich versuchen, die Daten stattdessen als 2D-Array zu speichern?

Mir ist auch aufgefallen, dass einige Leute erwähnen, dass es am besten ist, Kollisionsprüfungen horizontal und vertikal zu trennen. Warum ist das genau so?

JiminyCricket
quelle

Antworten:

12

Ich denke nicht, dass Sie versuchen sollten, die gesamte Karte in eine Karte mit einer einzigen Höhe zu konvertieren, genau wegen des von Ihnen beschriebenen Problems. Karten können eine beliebige Komplexität haben, die Sie in einer Höhenkarte nicht darstellen könnten.

Sie müssen jedoch auch nicht für jeden Fliesentyp eine feste Neigung haben. Sie können Kollisionsinformationen pro Pixel für jeden Kacheltyp speichern oder aus dem Alphakanal der Kachel berechnen und anhand der Kacheln, die er gerade schneidet, bestimmen, wo der Charakter in jedem Moment stehen soll. Hier ist ein Beispiel für die Kollisionsdaten für eine Kachel:

Geben Sie hier die Bildbeschreibung ein

Mit diesem Schema können Sie jede Art von Neigung erzielen, indem Sie einfach die Kollisionsmaske der Kachel variieren. Auf diese Weise wurden Sonic-Spiele damals implementiert. Daher empfehle ich, die folgende Seite zum besseren Verständnis vollständig zu lesen:

http://info.sonicretro.org/SPG:Solid_Tiles#Slopes_And_Curves

Um Kollisionen zwischen Ihrem Charakter und der Umgebung zu verarbeiten, schlage ich vor, einige Sensoren oder Kollisionspunkte auf Ihrem Charakter zu definieren, z. B. die magentafarbenen Punkte auf dem Bild unten:

Geben Sie hier die Bildbeschreibung ein

Beispielsweise könnten die oberen Sensoren verwendet werden, um Kollisionen mit der Decke zu erfassen und darauf zu reagieren, die mittleren Sensoren könnten verwendet werden, um Kollisionen gegen Wände zu erfassen und darauf zu reagieren, und die unteren Sensoren könnten verwendet werden, um Kollisionen mit dem Boden zu erfassen und die zu bestimmen richtige Höhe für den Spieler. Durch Bewegen der mittleren Sensoren nach oben und unten können Sie steuern, wie steil ein Hang sein muss, bevor der Spieler ihn nicht mehr erklimmen kann.

Ein weiterer guter Trick, den Sie mit den unteren Sensoren machen können, besteht darin, je nachdem, wie viele von ihnen mit dem Boden kollidieren, zu erkennen, wann sich der Player in der Nähe eines Felsvorsprungs befindet, und möglicherweise eine andere Animation wie das folgende Bild abzuspielen.

Geben Sie hier die Bildbeschreibung ein

David Gouveia
quelle
Vielen Dank für die Antwort. Ich habe einen anderen Ansatz mit der Bildung vorgenerierter Pfade versucht, versuche es aber jetzt. Ich habe meinen obigen Beitrag bearbeitet, aber es ist wirklich eine andere Frage, daher werde ich ihn als separate Frage veröffentlichen.
JiminyCricket