Skocz do zawartości

AI przeciwników


Sylvan

Rekomendowane odpowiedzi

Witam, poszukuję pomocy w stworzeniu inteligencji do przeciwników.

Inteligencja, której potrzebuję jest rodem z gry skradanki, gdyż robię grę typu top-down shooter.

Szukałem w necie tutorialów do AI, lecz problemem okazał się być albo moja wersja game makera, albo przeciwnicy tylko stali i strzelali do mnie z miejsca, ale tylko gdy mnie widzieli. W tym też problem, że chciałbym mieć możliwość podchodzenia do nich bez bycia wykrytym, niestety strzelają nawet, gdy są do mnie ustawieni tyłem. O to jak ja to widzę:

-przeciwnik podąża za ścieżką

-zastosowanie eyesight (trójkąta rodem z serii commandos, który pokazuje zasięg wzroku naszych przeciwników)

-eyesight jest przyczepiony do przeciwnika, więc gdy gracz znajdzie się w polu widzenia przeciwnika, ten zacznie go atakować

-eyesight nie jest w stanie wykryć gracza, gdy pomiędzy graczem a przeciwnikiem jest ściana

-system szukania, jeśli przeciwnik z traci gracza z pola widzenia, przeciwnik szuka nas poprzez wymachiwaniem eyesight w lewo i prawo, jeśli nie może znaleźć gracza wraca do ścieżki

-pathfinding jeśli gracz schowa się za ścianą, przeciwnik pobiegnie do ostatniego miejsca, w którym widział gracza, potem przystąpi do rozglądania się i ewentualnie wróci do ścieżki

Jestem początkujący w Game Makerze, posiadam wersję 8 pro. Narazie posiadam zwykłe AI przeciwników (stoją w miejscu i strzelają, gdy tylko nas zauważą).

Chciałbym też wiedzieć, czy to jest w ogóle możliwe do wykonania, jeśli tak to jak bardzo trudne to jest.

Jeśli nie potrafiłem wyjaśnić powyższego działania AI, mam tutaj schemat działania tego AI.

gm1.png

gm2.png

gm3.png

Czy wiedzielibyście jak wykonać takie AI, lub mielibyście namiary na tutoriale?

Odnośnik do komentarza
Udostępnij na innych stronach

To można zrobić jednym if'em.

Zaraz wrócę z editem.

GML (step przeciwnika)
angle=((((direction - point_direction(x,y,gracz.x,gracz.y)) mod 360) + 540) mod 360) - 180

 

if(angle<=20 and point_distance(x,y,gracz.x,gracz.y)<=100)

if(!collision_line(x,y,gracz.x,gracz.y,ściana,1,1))

{

//widzi gracza

}

 

Do angle jest zapisywana różnica pomiędzy kierunkiem w który patrzy przeciwnik, a kierunkiem w jaki snajdyje się gracz.

PIerwszy warunek (angle<=20) sprawdza czy różnica jest mniejsza od 20, z każdej strony. Więc daje nam to zasięg widzenia 40 stopni. Możesz to sobie dostroić.

Drugi warunek (point_distance(x,y,gracz.x,gracz.y)<=100) sprawdza czy gracz jest w zasięgu 100px. To też możesz to sobie dostroić.

Trzeci warunek (!collision_line(x,y,gracz.x,gracz.y,ściana,1,1)) sprawdza czy pomiędzy graczem a przeciwnikiem jest jakiś obiekt ściana.

Taki zapis sprawi że trzeci warunek (teoretycznie najtrudniejszy dla procesora) wykonywać się będzie tylko gdy pozostałe dwa będę spełnione. Trochę optymalizacji nikomu nie zaszkodzi. ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Skrypt działa dobrze, niestety ten eyesight jest stały nie idzie z rotacją przeciwnika i nie podąża za graczem, przez co przeciwnik ma możliwość obrotu tylko przez pierwszy warunek "angle<=20"

gm4.png

Chociaż kręciłem się w kółko przeciwnika, on przestawał do mnie strzelać, gdy nie znajdowałem się w eyesight.

Jeszcze pozostaje kwestia podążania, gdy przeciwnik mnie zauważy ma nie tylko strzelać, ale także podążać za przeciwnikiem. Czy da się też stworzyć pathfinding, aby przeciwnik nie wchodził w ściany?

Poniżej daję kod, który dałem do step'u przeciwnika

GML
angle=((((direction - point_direction(x,y,obj_player.x,obj_player.y)) mod 360) + 540) mod 360) - 180

canshoot-=1

if(angle<=20 and point_distance(x,y,obj_player.x,obj_player.y)<=300)

if collision_line(x,y,obj_player.x,obj_player.y,obj_wall,true,true)<0{

image_angle=point_direction(x,y,obj_player.x,obj_player.y)

if canshoot<0

{

canshoot=5

shot=instance_create(x,y,obj_enemyshoot)

shot.direction=image_angle

shot.image_angle=image_angle

shot.speed=16

}

}

if hp<1 instance_destroy()

Odnośnik do komentarza
Udostępnij na innych stronach

W pierwszej linii zmień direction na image_angle.

Direction to kierunek w którym obiekt podąża ( wyznaczają go wektory hspeed i vspeed ) a image_angle to kierunek w którym obiekt jest obrócony ( u ciebie w którą stronę patrzy )

 

Mój pathfinding https://forum.gmclan.org/index.php?showtopic=29026

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkie dzięki! Skrypt działa jak miód. Ale jest jeszcze jeden problem z przeciwnikami. Chodzi o ich kierunek, występuje teraz tak, że biegną do mnie tyłem i nie pomoże zmiana kierunku sprite'a, bo strzelać mogą tylko wtedy, gdy są obróceni w stronę gracza. Nie wiem, który skrypt wam pokazać (step, alarm_0), żebyście wiedzieli, w którym co mam zmienić. EDIT:Sądzę, że problemem jest to, że pathfinding włącza się, zanim przeciwnik zauważy gracza. Dlatego przeciwnik chodzi za graczem, a strzela dopiero jak znajdzie się w polu jego widzenia. EDIT #2:Czyli mamy problem z posiadaniem dwóch pól widzenia, jeden dla pathfindera i drugi dla przeciwnika. Pathfinder znajduje gracza i podąża za nim, a przeciwnik znajduje gracza i strzela do niego, tylko gdy wejdę w jego pole widzenia. EDIT #3: Dobra, problem rozwiązany, okazało się, że pathfinder ma większe pole widzenia od przeciwnika, więc pathfinder widział mnie z większej odległości niż przeciwnik mógł. Powiększyłem zasięg przeciwnika i wszystko działa. Dziękuję za pomoc. EDIT #4: A co zrobić, żeby pathfinder uaktywniaj się wtedy gdy przeciwnik nas zauważy? W sensie, że gdy znajdziemy się w jego polu widzenia, bo jakoś dalej przeciwnicy biegną do gracza tyłem.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...