Mam problem z rozdzielczością kolizji AABB.
Rozwiązuję przecięcie AABB, rozwiązując najpierw oś X, a następnie oś Y. Ma to na celu uniknięcie tego błędu: http://i.stack.imgur.com/NLg4j.png
Obecna metoda działa dobrze, gdy obiekt porusza się w odtwarzaczu, a gracz musi zostać popchnięty poziomo. Jak widać na .gif, poziome kolce popychają gracza poprawnie.
Jednak gdy pionowe kolce przemieszczają się do gracza, oś X jest nadal rozpatrywana jako pierwsza. To uniemożliwia „wykorzystanie kolców jako podnośnika”.
Kiedy gracz porusza się do pionowych kolców (pod wpływem grawitacji, wpada w nie), pcha się na oś Y, ponieważ na początku na osi X nie zachodziło na siebie nakładanie się.
Coś, co wypróbowałem, to metoda opisana w pierwszej odpowiedzi tego linku: wykrywanie kolizji obiektów prostokątnych 2D
Jednak kolce i poruszające się obiekty poruszają się, zmieniając ich położenie, a nie prędkość, i nie obliczam ich następnej przewidywanej pozycji, dopóki nie zostanie wywołana metoda Update (). Nie trzeba dodawać, że to rozwiązanie również nie działało. :(
Muszę rozwiązać kolizję AABB w taki sposób, aby oba opisane powyżej przypadki działały zgodnie z przeznaczeniem.
To jest mój obecny kod źródłowy kolizji: http://pastebin.com/MiCi3nA1
Byłbym naprawdę wdzięczny, gdyby ktoś mógł się temu przyjrzeć, ponieważ ten błąd występował w silniku od samego początku, a ja starałem się znaleźć dobre rozwiązanie, bez żadnego sukcesu. To poważnie zmusza mnie do spędzania nocy na przeglądaniu kodu kolizji i uniemożliwia mi przejście do „zabawy” i kodowanie logiki gry :(
Próbowałem wdrożyć ten sam system kolizji, co w wersji demonstracyjnej platformówki XNA AppHub (kopiując i wklejając większość rzeczy). Jednak błąd „skakania” występuje w mojej grze, podczas gdy nie występuje w wersji demo AppHub. [bug bug: http://i.stack.imgur.com/NLg4j.png ]
Aby skoczyć, sprawdzam, czy gracz jest „na ziemi”, a następnie dodaj -5 do Velocity.Y.
Ponieważ Velocity.X gracza jest wyższy niż Velocity.Y (patrz czwarty panel na schemacie), onGround jest ustawiany na true, kiedy nie powinien, i pozwala graczowi skakać w powietrzu.
Wydaje mi się, że tak się nie dzieje w wersji demonstracyjnej AppHub, ponieważ prędkość gracza nigdy nie będzie wyższa niż Velocity.Y, ale mogę się mylić.
Rozwiązałem to wcześniej, rozwiązując najpierw na osi X, a następnie na osi Y. Ale to zepsuło kolizję z kolcami, jak powiedziałem powyżej.