Chcę mieć proste nachylenia 45 ° w mojej platformówce opartej na kafelkach, jednak wydaje mi się, że nie mogę obniżyć algorytmu. Proszę spojrzeć na kod i wideo, może brakuje mi oczywistości?
//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;
}
Film z tego, jak to wygląda: http://youtu.be/EKOWgD2muoc
xna
c#
xna-4.0
platformer
xNidhogg
źródło
źródło
Odpowiedzi:
Z tego, co rozumiem, czytając twoje pytanie, chcesz obliczyć prawidłową
Y
pozycję, biorąc pod uwagęX
pozycję gracza. To jest raczej banalne. Spójrz na ten obraz:Zakładając, że kafelek nachylenia znajduje się w określonej pozycji
x,y
(początek znajduje się u dołu po lewej, jak na obrazku). Masz pozycję graczax1
oraz szerokość i wysokość nachylonej płytki (u, v
).x, y
ix1
są współrzędnymi świata.Biorąc pod uwagę te parametry, twoja pozycja Y gracza (
y1
) byłaby:Jeśli masz do czynienia tylko z kątami 45 stopni, staje się to jeszcze prostsze:
Jeśli nachylenie jest odwrotne, to:
źródło
m
ib
w obliczeniach?Chociaż już na to odpowiedziano, pozwólcie, że zaproponuję inne równanie:
y = mx + b
gdzie y jest obliczoną współrzędną, m jest nachyleniem (-1 dla spadku o 45 stopni, 1 dla wzrostu o 45 stopni), a b jest przecięciem y - - współrzędna y, gdzie x = 0.Pozwala to na nieco większą elastyczność; możesz zmienić m, aby obliczyć inne nachylenie inne niż 45 stopni. Na przykład m pi / 3 daje nachylenie 30 stopni.
źródło
Na tej stronie możesz znaleźć wiele wartości: http://info.sonicretro.org/Sonic_Physics_Guide
Specjalnie dla tego, czego szukasz, sprawdź sekcję Solid Tiles: Slopes and Curves. Zasadniczo pokazuje, jak uważa się, że osiągnięto to we wczesnych grach Sonic.
źródło
Możesz zajrzeć do Oddzielnej Teorii Osi, rozwiąże ona problem nachylenia, ale wymaga sporo matematyki, a sama teoria zajmuje trochę czasu. Połączyłem cię z tutorialem i książką, która lepiej to wyjaśnia
Samouczek oprogramowania metanets
Wykrywanie kolizji w czasie rzeczywistym
źródło
Wydaje mi się, że albo gdzieś indziej masz błąd „jeden po drugim”, albo nie ustawiasz flag _leftSlope / _rightSlope we właściwym czasie. Ten kod w ogóle nie dotyka ruchu X, ale wydaje się, że to twój problem w filmie.
Powinieneś sprawdzić, czy te flagi są w ogóle uruchamiane. Następnie sprawdź wykrywanie kolizji w poziomie: nie chcesz, aby wyzwalało się na zboczu.
źródło