45 ° -Steigungen in einem auf Kacheln basierenden 2D-Plattformer

12

Ich möchte einfache 45 ° -Neigungen in meinem kachelbasierten Plattformer haben, aber ich kann den Algorithmus einfach nicht herunterfahren. Bitte schauen Sie sich den Code und das Video an, vielleicht fehlt mir das Offensichtliche?

//collisionRectangle is the collision rectangle of the player with 
//origin at the top left and width and height
//wantedPosition is the new position the player will be set to.
//this is determined elsewhere by checking the bottom center point of the players rect
if(_leftSlope || _rightSlope)
{        
    //Test bottom center point
    var calculationPoint = new Vector2(collisionRectangle.Center.X, collisionRectangle.Bottom);
    //Get the collision rectangle of the tile, origin is top-left
    Rectangle cellRect =
        _tileMap.CellWorldRectangle(
            _tileMap.GetCellByPixel(calculationPoint));
    //Calculate the new Y coordinate depending on if its a left or right slope
    //CellSize = 8
    float newY = _leftSlope
                            ? (calculationPoint.X % CellSize) + cellRect.Y
                            : (-1 * (calculationPoint.X % CellSize) - CellSize) + cellRect.Y;
    //reset variables so we dont jump in here next frame
    _leftSlope = false;
    _rightSlope = false;
    //now change the players Y according to the difference of our calculation
    wantedPosition.Y += newY - calculationPoint.Y;
}

Video, wie es aussieht: http://youtu.be/EKOWgD2muoc

xNidhogg
quelle
1
Sind Vektoren nicht großartig? : D
Gustavo Maciel

Antworten:

10

Nach dem, was ich bei der Lektüre Ihrer Frage verstehe, möchten Sie die richtige YPosition bei gegebener XPosition des Spielers berechnen . Das ist eher trivial. Schauen Sie sich dieses Bild an:

Steigung

Angenommen, Ihre Hangkachel befindet sich an einer bestimmten Position x,y(der Ursprung ist wie im Bild unten links). Sie haben die Position des Spielers x1und die Breite und Höhe des geneigten Plättchens ( u, v). x, yund x1sind Weltkoordinaten.

Bei diesen Parametern y1wäre die Y-Position Ihres Spielers ( ):

y1 = y + (x1 - x) * (v / u)

Wenn Sie nur mit 45-Grad-Winkeln arbeiten, wird es noch einfacher:

y1 = y + (x1 - x)

Wenn die Steigung umgekehrt ist, ist es:

y1 = y + (v - (x1 - x))
Blödmann
quelle
Nachdem ich @SkimFlux Fix plus dein neues Formular plus ein paar blöde Dinge angewendet habe, habe ich übersehen, dass es funktioniert hat. Vielen Dank.
xNidhogg
Könnten Sie y = mx + b nicht für eine einfachere Berechnung verwenden?
Asche999
@ashes999 Ich glaube nicht, dass es viel einfacher wird als das, was ich geschrieben habe. Was sind mund bin Ihrer Berechnung?
Bummzack
@bummzack m ist Ihre Steigung (1 für eine 45-Grad-Steigung nach unten, -1 für nach oben) und b wäre der Schnittpunkt auf der x-Achse. Algebra der 9. Klasse. Ich sag bloß'.
Asche999
@ ashes999 Ja, es ist lange her. Fühlen Sie sich frei, diese Gleichung als Antwort zu posten.
Bummzack
8

Erlauben Sie mir, obwohl dies bereits beantwortet wurde, eine andere Gleichung anzubieten: y = mx + bDabei ist y die berechnete Koordinate, m die Steigung (-1 für abwärts bei 45 Grad, 1 für aufwärts bei 45 Grad) und b der y-Achsenabschnitt. - die y-Koordinate mit x = 0.

Dies ermöglicht Ihnen etwas mehr Flexibilität; Sie können m ändern, um eine andere Neigung als 45 Grad zu berechnen. Zum Beispiel ergibt ein m von pi / 3 eine Neigung von 30 Grad.

ashes999
quelle
4

Auf dieser Website finden Sie möglicherweise viele nützliche Informationen : http://info.sonicretro.org/Sonic_Physics_Guide

Speziell für das, wonach Sie suchen, lesen Sie den Abschnitt Massivkacheln: Steigungen und Kurven. Es zeigt Ihnen im Grunde, wie es geglaubt wird, dass dies in den frühen Sonic-Spielen erreicht wurde.

SpartanDonut
quelle
Interessant zu lesen, aber zu komplex. Diese Art von Neigung ist die einzige, die ich möchte, und sollte daher die Lösung vereinfachen. Ein Höhenkarten- / Sensor- / Scannersystem wäre dafür übertrieben. Vielen Dank für den Link.
XNidhogg
2

Vielleicht möchten Sie einen Blick in den Seperate Axis Theorm werfen. Er wird Ihr Hangproblem lösen, erfordert jedoch einiges an Mathematik und die Theorie selbst braucht eine Weile, um sich einen Überblick zu verschaffen. Ich habe Sie mit einem Tutorial und einem Buch verknüpft, das es besser erklärt

metanetsoftware Tutorial

Echtzeit-Kollisionserkennung

dbomb101
quelle
das ist zu viel, imo. Dies ist ein stark vereinfachter Fall, und andere Anwendungen von SAT wären nicht erforderlich. Vielen Dank, dass Sie sich die Zeit genommen haben, die Links aufzurufen.
XNidhogg
2

Ich denke, Sie haben irgendwo anders einen Fehler, oder Sie setzen die _leftSlope / _rightSlope-Flags nicht zum richtigen Zeitpunkt. Dieser Code berührt die X-Bewegung überhaupt nicht, aber das scheint Ihr Problem im Video zu sein.

Sie sollten prüfen, ob diese Flags überhaupt ausgelöst werden. Überprüfen Sie dann Ihre horizontale Kollisionserkennung: Sie möchten nicht, dass sie an einem Hang ausgelöst wird.

SkimFlux
quelle
Oh Gott, richtig. In diesem Fall möchte ich keine horizontale oder vertikale Kollisionserkennung. Ich habe völlig vergessen, das zu deaktivieren. Sieht jetzt irgendwie besser aus, ist aber noch nicht fertig. Vielen Dank.
xNidhogg