Nachylenia 45 ° w platformówce 2D opartej na kafelkach

12

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

xNidhogg
źródło
1
Czy wektory nie są niesamowite? : D
Gustavo Maciel

Odpowiedzi:

10

Z tego, co rozumiem, czytając twoje pytanie, chcesz obliczyć prawidłową Ypozycję, biorąc pod uwagę Xpozycję gracza. To jest raczej banalne. Spójrz na ten obraz:

nachylenie

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ę gracza x1oraz szerokość i wysokość nachylonej płytki ( u, v). x, yi x1są współrzędnymi świata.

Biorąc pod uwagę te parametry, twoja pozycja Y gracza ( y1) byłaby:

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

Jeśli masz do czynienia tylko z kątami 45 stopni, staje się to jeszcze prostsze:

y1 = y + (x1 - x)

Jeśli nachylenie jest odwrotne, to:

y1 = y + (v - (x1 - x))
grzmot
źródło
po zastosowaniu poprawki @SkimFlux oraz nowej formuły plus głupich rzeczy, które przeoczyłem, zadziałały. dzięki.
xNidhogg
Czy nie możesz użyć y = mx + b dla uproszczenia obliczeń?
ashes999
@ ashes999 Nie sądzę, żeby stało się to o wiele prostsze niż to, co napisałem. Jakie są mi bw obliczeniach?
bummzack
@bummzack m to twoje nachylenie (1 dla nachylenia 45 stopni w dół, -1 dla wzniesienia), a b będzie przecięciem na osi x. Algebra klasy 9. Tylko mówię'.
ashes999
@ ashes999 Tak, to już dawno. Możesz opublikować to równanie jako odpowiedź.
bummzack
8

Chociaż już na to odpowiedziano, pozwólcie, że zaproponuję inne równanie: y = mx + bgdzie 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.

ashes999
źródło
4

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.

SpartanDonut
źródło
ciekawa lektura, ale zbyt skomplikowana. Tego rodzaju nachylenie jest jedynym, którego chcę, dlatego powinno uprościć rozwiązanie. Mapa wysokości / czujnik / system skanera byłaby w tym przypadku nadmierna. Dzięki za wykopanie linku.
xNidhogg
2

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

dbomb101
źródło
to za dużo, imo. Jest to bardzo uproszczony przypadek i nie byłoby potrzeby korzystania z innych zastosowań SAT. Dziękujemy za poświęcenie czasu na pobranie linków.
xNidhogg
2

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.

SkimFlux
źródło
o Boże, prawda. Właściwie to nie chcę wykrycia kolizji poziomej lub pionowej, kiedy to się stanie. Zupełnie zapomniałem to wyłączyć. Wygląda teraz jakoś lepiej, ale jeszcze nie zostało zrobione. Dzięki.
xNidhogg