Sylvan Opublikowano 24 Lutego 2013 Udostępnij Opublikowano 24 Lutego 2013 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. Czy wiedzielibyście jak wykonać takie AI, lub mielibyście namiary na tutoriale? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 24 Lutego 2013 Udostępnij Opublikowano 24 Lutego 2013 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 Więcej opcji udostępniania...
Sylvan Opublikowano 25 Lutego 2013 Autor Udostępnij Opublikowano 25 Lutego 2013 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" 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 Więcej opcji udostępniania...
I am Lord Opublikowano 26 Lutego 2013 Udostępnij Opublikowano 26 Lutego 2013 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 Więcej opcji udostępniania...
Sylvan Opublikowano 26 Lutego 2013 Autor Udostępnij Opublikowano 26 Lutego 2013 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę