Huri Opublikowano 3 Października 2013 Udostępnij Opublikowano 3 Października 2013 Cześć :) Wczoraj wziąłem się za sztuczną inteligencję i prawie mi się udało. Używam funkcji z rodziny mp_grid i ... prawie udało mi się osiągnąć zamierzony cel!!! Otóż teraz jest tak: Gdy gracz zblizy się do przeciwnika na odległość mniejsza niż ustalona i jednocześnie jeżeli między graczem a przeciwnikiem nie ma przeszkody (collision_line) to przeciwnik rusza się po wytyczonej przez mp_grid_path ścieżce. W momencie gdy gracz wyjdzie z zasięgu lub pojaw się między nim a przeciwnikiem ściana to przeciwnik idzie do miejsca, w którym ostatnio widział gracza. Wszystko pięknie i tak jakbym chciał... poza tym, że mimo maski kolizji na full image przeciwnik zdaje się częściowo ignorować ściany. Czasami przechodzi przez nie czasami nie. Siedzę nad tym trochę już i głowa zaczyna mi parować bo nie mogę znaleźć miejsca gdzie popełniam błąd. Tutaj możecie pobrać sobie plik. Tylko GM Studio bo ... dluga historia.. W kazdym razie mam tylko GM Studio teraz. Spakowane 7zip. PLICZEK Z PROJEKTEM Dla tych, którzy nie chcą ściągać kod GML z obj_enemy CREATE GML grid = mp_grid_create(0, 0, room_width / 16, room_height /16, 16, 16) mp_grid_add_instances(grid, obj_wall, false); path=path_add(); path2=path_add(); spottedx=x; spottedy=y; STEP GML if !collision_line(x,y,obj_player.x,obj_player.y,obj_wall,true,true) && distance_to_object(obj_player)<128{ if instance_exists(obj_enemy) { path2=path_add(); spottedx=obj_player.x; spottedy=obj_player.y; mp_grid_path(grid,path2, x,y,obj_player.x+8, obj_player.y+8, false); path_start(path2,1,0,false); } } else{ if (!(x=spottedx && y=spottedy)){ path2=path_add(); mp_grid_path(grid,path2, x,y,spottedx, spottedy, false);} else { if path_exists(path2) path_delete(path2);} } W draw mam tylko polecenia wyświetlające siatkę żeby ją widzieć do testów ale dla świętego spokoju też tu wrzucę. DRAW GML draw_set_alpha(0.1); mp_grid_draw(grid); draw_set_alpha(1); draw_self(); Wszystkie sprite'y mają origin w 0,0 i full image rectangle jako maske kolizji. Aha no i docelowo chciałbym żeby enemy poruszał się góra dół i lewo prawo (w sumie tak jest teraz). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 3 Października 2013 Udostępnij Opublikowano 3 Października 2013 Nie mogę odtworzyć twojego problemu, w którym to dokładnie miejscu się to AI buguje? Bo mi chodzą dobrze. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Huri Opublikowano 3 Października 2013 Autor Udostępnij Opublikowano 3 Października 2013 Dobra inaczej. Jestem już tak zakręcony, że napisałem objawy poprzedniej wersji tego AI. Tak.. teraz wróg rusza się idealnie... prawie.. Co zrobić żeby nie nachodził na obiekt ściany? Rozumiem, że to przez to, że mp_grid_path prowadzi przez środek kratki/komórki (cell).. Kurczę nie wiem czy mnie ktoś teraz zrozumie. Jeśli tak to dobrze a jeśli nie.. to napiszę jutro z jaśniejszym umysłem mam nadzieje :) Może screen pokaże gdzie leży problem. W zielonych kółkach obj_enemy nachodzący na obj_wall. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am Lord Opublikowano 3 Października 2013 Udostępnij Opublikowano 3 Października 2013 Nadal nie rozumiem, nie możesz sprita po prostu przesunąć/wycentrować origin? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 3 Października 2013 Udostępnij Opublikowano 3 Października 2013 za czesto wolasz mp_grid_path. pierwsza czesc mp_grid_path idzie wtedy diagonalnie(jezeli sama mp_grid_path uzna za dobre) niezaleznie od ustawiena allowdiag na false Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Huri Opublikowano 4 Października 2013 Autor Udostępnij Opublikowano 4 Października 2013 (edytowane) EDIT: Ok problem prawie rozwiązany. Sprawa wydaje się tak oczywista, że bardziej już być nie może. Nie miałem even collision (obj_enemy -> obj_wall). Zrobiłem i już jest w 99% idealnie. Tylko teraz przeciwnik zatrzymuje się na ścianie. Muszę go tylko przy każdym ruchu wyrównywać do siatki. Niestety domyślam się, że nie będzie to takie super proste. Ale będę kombinował ale rady mile widziane EDIT2: Już prawie prawie :D ... Został ostatni warunek IF do przejrzenia gdzie zawiera błąd :D . Zdaje się, że przeciwnik nie dociera w dokładne miejsce gdzie ostatnio widział gracza (spottedx,spottedy). Taka mała dygresja: "Hehe ale fajna sprawa :) . Nie sądziłem, że problemy i ich rozwiązywanie przy pisaniu gier mogą dawać tyle radochy. Nie sądziłem bo wiem, że mój słomiany zapał i napotkane problemy zazwyczaj zabijają moje projekty. :D EDIT3: Nie wiem. Nie mogę dojść do tego dlaczego przeciwnik nie chce się czasami snapowac do grida i dlaczego nie idzie do ostatniej znanej pozycji gracza. Może trzeba spojrzeć na to świeżym okiem :) Pliczek poniżej (7zip). PLIK Sprawdziłem ustawienie allowdiag z true i z false. Działa to chyba dobrze. Widać różnicę między ruchem z allowdiag=true i allowdiag=false więc wydaje mi się, że nie tutaj jest problem. No chyba, że niezrozumiałem i przez to za częste wywoływanie mp_grid_path kolizje są ignorowane. Wydaje się tak jakby kolizje były badane tylko między origin obj_enemy i origin obj_wall czyli tak jakby collision mask był 0,0,0,0 (jeden pix). Edytowane 4 Października 2013 przez Huri 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ę