Auto-tracking problem

0

Witam, chciałbym wprowadzić do mojej gry auto-tracking. Czy istnieje coś podobnego do new Point() ale raczej w formie jakiejś prostej(odcinka)? Myślałem o poprowadzeniu linii od danego potwora i jeśli ktoś znajdowałby się na takiej linii on(potwór) zacząłby podążać do tego punktu. Mogę to zrobić za pomocą drawLine() i ustawić przezroczystość koloru na 0, ale uważam, że rysowanie np. 90 takich linii od jednego obiektu będzie zbyt pamięciożerne. Macie może jakiś pomysł?

0

Nie wiem o czym mówisz - i Ty też chyba nie wiesz... mógłbyś to sprecyzować.

0

Jeśli potwór nie ma omijać przeszkód, to wystarczy Ci funkcja atan2 by wyznaczyć kierunek.

0

Masz pozycję gracza, pozycję potwora i wektor, w kierunku którym potwór patrzy. Obliczasz wektor między pozycją gracza, a pozycją potwora (gracz.pozycja-potwór.pozycja). Liczysz długość tego wektora, czyli odległość między graczem a potworem. Jeżeli jest za daleko to go olewasz. Jeżeli nie to normalizujesz ten wektor. Liczysz iloczyn skalarny między tym wektorem, a wektorem kierunkowym patrzenia potwora. Da ci to cosinus kąta między tymi wektorami, w ten sposób możesz określić kąt widzenia potwora na gracza. Jeżeli chcesz >90 stopni, to wartość iloczynu skalarnego ma być powyżej zera. Jeżeli nie jest, to potwór sobie śpi, bo gracza nie widzi. Jak już go zobaczy to ten pierwszy wektor, który obliczyłeś i znormalizowałeś jest wektorem kierunkowym, po którym potwór ma się poruszać, żeby dotrzeć do gracza. Obliczasz nową pozycję potwora = potwór.pozycja + speed*wektor_kierunkowy.

0

Chodzi mi dokładnie o to co jest pokazane na tym filmie: (w 4 minucie najlepiej widać o co chodzi). Wieczorem wpadłem na pomysł jak to zrobić z wykorzystaniem 2 x drawLine(). Pierwsza linia poruszałaby się ciągle np od 45stopni do 90stopni i jeśli odszukałaby gracza zatrzymałaby się i potwór szedłby do punktu gdzie coś "zauważył", w tym samym czasie uruchomiłaby się druga linia, która "rozglądałaby się" za graczem, czy ten przypadkiem nie zmienił pozycji. Ale wolałbym unikać rysowań, bo wiem, że jest to pamięciożerne, dlatego z chęcią skorzystam z wyżej przedstawionego matematycznego rozwiązania problemu.

0

Rysowanie nie jest pamięciożerne, tylko męczy CPU (i to niebardzo, jeśli o linie chodzi), ale i rysowanie nie ma nic wspólnego z polem widzenia AI - to tylko reprezentacja tego co robi algorytm.

Moja propozycja jest taka, żebyś Ty się zajął czymś prostszym najpiew...

A poza tym do takiego czegoś używa się zdefyniowanych figur, a nie obrazków... Mógłbyś zrobić użytek z klasy Line2D która ma metodę intersects - dla prostokątów. Żeby sprawdzić czy linia zatrzymuje się na polygonie (jeśli byś chciał mieć bardziej skomplikowaną mapkę niż z prostokątów) musisz sprawdzić po kolei czy przecina każdy z jego boków.

Możesz też wykorzystać silnik JBox2D - który ray cast ma wbudowany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1