Robię grę 2D. W tej chwili latający helikopter jest sterowany przez gracza. Sterowanie odbywa się za pomocą klawiszy strzałek: GÓRA, LEWO i PRAWO.
Jest to prędkość wzdłuż osi y dy
, a prędkość wzdłuż osi x wynosi dx
.
Jego fizyka wygląda następująco:
Ilekroć przycisk UP nie jest wciśnięty , dy
przyspiesza ze stałym przyspieszeniem, bez końca w dół. (Powaga). dx
pozostaje w aktualnej wartości.
Gdy UP wciśnięty , dy
przyspiesza ze stałym przyspieszeniem, co obecnie jest to, aż do 4 (w górę, aż do osiągnięcia prędkości 4). dx
pozostaje w aktualnej wartości.
Po lewej stronie jest wciśnięty , dx
przyspiesza w stałym przyspieszeniem, z tego co obecnie jest to, do -4 .
Po naciśnięciu PRAWO , dx przyspiesza ze stałym przyspieszeniem, niezależnie od tego, jakie jest obecnie, do 4 .
(Kiedy LEWY lub PRAWY są naciskane, a GÓRA nie jest naciskana jednocześnie, jak powiedziałem: dy
coraz bardziej maleje, ponieważ grawitacja wpływa na helikopter)
Wszystko to sprawia, że śmigłowiec często podąża za łukami w powietrzu, a nie po liniach prostych.
To tworzy fizykę, która wydaje się całkiem realistyczna.
Moje pytanie brzmi:
Śmigłowiec przeciwnika, AI, powinien poruszać się przy użyciu tego samego systemu fizyki.
Powiedzmy, że AI chce dostać się z miejsca, w którym się aktualnie znajduje, do punktu B.
Gdyby w grze nie było grawitacji i stopniowego przyspieszania, byłoby to łatwe. Po prostu narysowałbym wektor z pozycji AI do punktu B i kazałbym AI podążać za nim.
Ale ponieważ istnieje grawitacja i stopniowe przyspieszenie, AI nigdy nie może poruszać się w linii prostej (prawie). jaki byłby najlepszy sposób, aby sztuczna inteligencja przeszła do punktu B tak oszczędnie, jak to możliwe?
Jak mogę wziąć pod uwagę grawitację, przenosząc AI do określonego miejsca docelowego?
(Jeśli łatwiej to wytłumaczyć, proszę rozważyć punkt B na tym samym poziomie na osi y co AI, a nie na przekątnej.)
Dzięki
Odpowiedzi:
tl; dr:
To samo z y. Pamiętaj, aby związać prędkość, aby była w zakresie od zera do prędkości maksymalnej. Jeśli w pewnym momencie wróg ma bardzo małą prędkość i próbuje się zatrzymać, może zacząć poruszać się w przeciwnym kierunku. Nie pozwól mu. Zatrzymaj go, jeśli zwalnia, a jego prędkość jest mniejsza niż 1 * Acc.
Wersja długa: Jeśli nie ma przeszkód, ruch na osi y jest całkowicie nieistotny dla (i nie wpływa) na ruch na osi x. Tak więc pytanie, które opisujesz, można podzielić na dwa osobne pytania.
CS.x
iCS.y
są naszą aktualną prędkością na osiach xiy.TS.x
&TS.y
Czy czas zajęłoby zatrzymać tylko pionowo lub poziomo, biorąc pod uwagę aktualną prędkość w odpowiedniej osi.D.x
iD.y
są odległością na każdej osi.tl; dr: kontynuujesz przyspieszanie (jeśli to możliwe [chyba że osiągnąłeś maksymalną prędkość]) na osi x, aż osiągniesz miejsce, w którym spełniony jest następujący warunek:
To samo z y.
źródło
Jednym z podejść, które zastosowałem dla podobnego problemu, było najpierw narysowanie wektora do celu, a następnie porównanie go z bieżącym kierunkiem prędkości.
Więc weź podpisany kąt między wektorem prędkości a wektorem docelowym i zastosuj siłę ciągu względem wielkości wektora.
Jeśli więc kąt a między czerwonym wektorem prędkości a zielonym wektorem docelowym jest ujemny, zastosuj ciąg dodatni, w przeciwnym razie nie zastosuj ciągu i pozwól grawitacji go rozwiązać.
Zauważ, że będziesz musiał traktować cztery ćwiartki, w których cel może być różnie (tak jakby cel znajdował się w lewym górnym rogu, dodatni kąt wymagałby zastosowania ciągu).
Upewnij się również, że zastosujesz siłę ciągu względem odchylenia od prędkości docelowej.
Technicznie nie bierze to pod uwagę grawitacji, lecz kompensuje bieżący stan i oznacza, że śmigłowiec AI może nie lecieć w linii prostej do celu, ale będzie trochę chybotać. To może, ale nie musi działać w twojej grze.
źródło
Możesz po prostu ponownie obliczyć ruch każdej klatki X. Zakładając, że nie umieszczasz zbyt wielu klatek pomiędzy, ale wystarczająco, aby nie wpłynęło to na wydajność, grawitacja na helikopterze nie powinna być wystarczająco silna, aby naprawdę zobaczyć zmieniającą się trajektorię. Ponadto myślę, że gracz mógłby poruszać się w ten sam sposób, dostosowując się do grawitacji podczas ruchu i nie planując tego.
źródło