Skocz do zawartości

Sztuczna inteligencja (mp_grid_) prawie działa


Huri

Rekomendowane odpowiedzi

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

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.

 

AI_BUG.png

Odnośnik do komentarza
Udostępnij na innych stronach

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 smile.gif

 

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 przez Huri
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ę...