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
xna
c#
xna-4.0
platformer
xNidhogg
quelle
quelle
Antworten:
Nach dem, was ich bei der Lektüre Ihrer Frage verstehe, möchten Sie die richtige
Y
Position bei gegebenerX
Position des Spielers berechnen . Das ist eher trivial. Schauen Sie sich dieses Bild an:Angenommen, Ihre Hangkachel befindet sich an einer bestimmten Position
x,y
(der Ursprung ist wie im Bild unten links). Sie haben die Position des Spielersx1
und die Breite und Höhe des geneigten Plättchens (u, v
).x, y
undx1
sind Weltkoordinaten.Bei diesen Parametern
y1
wäre die Y-Position Ihres Spielers ( ):Wenn Sie nur mit 45-Grad-Winkeln arbeiten, wird es noch einfacher:
Wenn die Steigung umgekehrt ist, ist es:
quelle
m
undb
in Ihrer Berechnung?Erlauben Sie mir, obwohl dies bereits beantwortet wurde, eine andere Gleichung anzubieten:
y = mx + b
Dabei 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.
quelle
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.
quelle
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
quelle
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.
quelle