Ruch w dół RPG z korekcją?

27

Mam nadzieję, że wszyscy graliśmy w Zelda: A Link to the Past, proszę mnie poprawić, jeśli się mylę, ale chcę naśladować tego rodzaju ruchy postaci 2D z góry z odrobiną korekty. Dokonano tego w innych grach, ale uważam, że ten odnośnik byłby najłatwiejszy do odniesienia. Mówiąc dokładniej, rodzaj ruchu i korekty, o której mówię, to:

  • Ruch swobodny nie ogranicza się do ruchu opartego na kafelkach, takiego jak Pokemon i inne gry, w których jedno dotknięcie pola ruchu przesuwa cię o jedno pole w tym głównym kierunku. Ten ruch pływający powinien umożliwiać ruch po przekątnej.
  • Jeśli idziesz na zachód i dojdziesz do ściany, która jest ukośna w stylu północno-wschodnim / południowo-zachodnim, jesteś skorygowany do ruchu południowo-zachodniego, nawet jeśli nadal przytrzymasz lewy (zachodni) przycisk kontrolera. Powinno to działać w przypadku korekcji obu przekątnych w obu kierunkach.
  • Jeśli dzieli Cię kilka pikseli od wejścia prosto do drzwi lub korytarza, jesteś skorygowany do przejścia korytarzem lub korytarzem, tzn. Wpadnięcie w kąt powoduje, że jesteś wepchnięty do korytarza / drzwi.

Poszukiwałem skutecznych sposobów na osiągnięcie tego i nie miałem szczęścia. Dla jasności mówię o ruchu ludzkiej postaci, a nie ruchu NPC. Czy ich zasoby są dostępne w tego rodzaju ruchu? Równania lub algorytmy wyjaśnione na wiki czy coś takiego?

Używam frameworka XNA, czy jest w tym coś, co mogłoby pomóc?

Corey Ogburn
źródło

Odpowiedzi:

23

Cóż, pierwszy punkt jest łatwy. Po prostu przechowujesz i manipulujesz pozycją postaci we współrzędnych świata lub pikseli zamiast współrzędnych opartych na kafelkach. Jeśli masz z tym problem, może to wynikać z mylącego wyboru reprezentacji dla twojego świata i przestrzeni kafelkowej, więc być może powinieneś opublikować więcej szczegółów na ten temat / zadać osobne, szczegółowe pytanie.

Po drugie, najbardziej bezpośrednim podejściem byłoby pobranie (znormalizowanego) wektora ruchu gracza i dodanie go do normalnego wektora ściany, a następnie ponowna normalizacja. Znak składników powstałego wektora wskaże, w jaki sposób ściana odnosi się do ruchu gracza, podczas gdy sam wektor wskazuje kierunek, w którym gracz może się teraz poruszać.

Po trzecie, zakładając, że masz prostokąty kolizji zarówno dla ściany, jak i odtwarzacza, powinieneś być w stanie określić, ile z kolizji prostownika gracza styka się z prostokątem kolizyjnym ściany. Jeśli na przykład gracz porusza się w prawo i uderza w pionową ścianę, porównuje się zakresy prostokątów kolizji w osi Y - jeśli zasięg gracza przekracza zasięg ściany o pewien próg, powiedz 75% Y gracza osi, a następnie „oszukujesz” gracza w kierunku drzwi.

Poczyniłem tutaj wiele założeń dotyczących wyglądu modelu obiektowego w kodzie i wybranych technik - głównie ze względu na ogólność pytania. Próbowałem sugerować podejścia, które są proste (choć być może nie optymalne) z tego samego powodu. Jeśli możesz podać bardziej szczegółowe informacje, w tym pytaniu lub w nowym, mogę spróbować podać więcej szczegółów lub lepszy pomysł.

Josh
źródło
Tak, przestawienie postaci nie było problemem. Tylko upewniając się, że ludzie widzą, że to wymaganie. Dałeś mi kluczową odpowiedź: płytki z wektorami! Nie mogę uwierzyć, że o tym nie pomyślałem. Dziękuję Ci.
Corey Ogburn,
W Zelda były one tylko pod jednym kątem, więc nie było potrzeby obliczania wektorów normalnych, był to tylko specjalny przypadek w kodzie.
BlueRaja - Danny Pflughoeft
Nie rozumiem, jak nadajesz kafelkowi wektor. Jakby to wyglądało?
test
Kafelek już prawdopodobnie zawiera takie dane, jak grafika, niezależnie od tego, czy jest przejezdny itp. To tylko kolejne pole. Na przykład: struct Tile {vector2 normal; ...} Wartość normalna powinna pochodzić z danych definiujących kafelek
Josh
@JoshPetrie Zmiana tego. Czy kafelek, który można zderzyć w wielu kierunkach, nie musiałby mieć wielu wektorów? Nie jestem pewien, czy rozumiem, jak płytka może mieć pojedynczy wektor.
test
4

Możliwą odpowiedzią na drugi punkt jest rzutowanie wektora ruchu gracza wzdłuż wektora ściany za pomocą iloczynu punktowego (ab * znormalizowany (b)). Następnie otrzymujesz wektor, który mówi ci, jak daleko przesunąć gracza w kierunku ściany, a jeśli przesuniesz gracza o ten wektor, dostaniesz „poślizg” wzdłuż ściany. Pracował dla mnie dobrze w poprzednim projekcie gry.

James
źródło
3

Świetna odpowiedź dla Josha, ale dodam kilka sugestii: - Aby uzyskać więcej informacji na temat przesuwania się po ścianach, sprawdź moje pytanie - z tej odpowiedzi udało mi się sprawić, że działa naprawdę ładnie. - Jeśli się nie mylę, podczas chodzenia po ekranie Link z łatwością dopasuje się do najbliższego całego poziomego kwadratu siatki. W ten sposób, gdy dojdziesz do drzwi, bardziej prawdopodobne jest, że będziesz prawidłowo ustawiony (może się mylić). - Aby ułatwić przejście przez drzwi, upewnij się, że pole kolizyjne twojej postaci jest znacznie mniejsze niż szerokość drzwi.

Iain
źródło
A może pole kolizji może być kołem?
Oskar Duveborn,
2

Aby skorygować wchodzenie do drzwi, możesz sprawić, że obiekt kolizji dla drzwi będzie nieco większy niż obraz drzwi. Spowodowałoby to ten sam efekt zaproponowany przez Josha, ale bez konieczności obliczania odległości od prostokąta kolizyjnego ściany.

RavensKrag
źródło