Skocz do zawartości

Ośmiokierunkowe poruszanie się AI


Naoh

Rekomendowane odpowiedzi

Witam,

Mam problem, ktory mi wydaje się dość skomplikowany. Robię grę na wzór Alien Breeda, gdzie zarówno gracz jak i NPC oraz przeciwnicy mogliby sie poruszać tylko i wyłącznie w 8 kierunkach. O ile w kwestii kontroli gracza nie jest to najmniejszy problem:

 

GML
w mocnym skrócie

 

if (keyboard_check(vk_up)) {y-=2.5; direction -= (((((direction - point_direction(x,y,x,y-2)) mod 360) + 540) mod 360) - 180)/(4)}

if (keyboard_check(vk_down)) {y+=2.5; direction -= (((((direction - point_direction(x,y,x,y+2)) mod 360) + 540) mod 360) - 180)/(4)}

if (keyboard_check(vk_left)) {x-=2.5; direction -= (((((direction - point_direction(x,y,x-2,y)) mod 360) + 540) mod 360) - 180)/(4)}

if (keyboard_check(vk_right)) {x+=2.5; direction -= (((((direction - point_direction(x,y,x+2,y)) mod 360) + 540) mod 360) - 180)/(4)}

 

i standardowo image_angle=direction

point direction zastosowany żeby sprite nie przeskakiwał obrotem o ileśtam stopni, a stopniowo obracal się w tym wypadku w 4 krokach.

 

 

To przy AI jest dla mnie takie coś nielada wyzwaniem. Próbowałem

 

GML
jeśli odległośc do gracza jest > xxx

{

speed=2;

direction = ((point_direction(x, y, obj_player.x, obj_player.y)+22.5) div 45) * 45;

alarm[0]=room_speed;

}

 

else, czyli jesli odleglosc jest mniejsza {cośtamcośtam}

 

-----------

w alarmie to samo, gdzięki czemu sprite nam nie skacze, a bierze poprawki na sytuacje co sekunde

 

z tym, że na point direction nie da się zbytnio zbudować AI, przynajmniej mi to kompletnie nie wychodzi, w szczególności jeśli chodzi o zwracanie uwagi na elementy otoczenia, jak ściany.

 

zastanawiałem się nad zrobieniem tego na girdach, ale obeznany z nimi zupełnie nie jestem.

 

AI zbyt skomplikowane być nie musi, jako że większość przeciwników atakuje wręcz.

Odległość większa od 32 (bo sprity postaci mają 64, tak więc 32 odleglosci to wlasnie ten moment gdy stają 'twarza w twarz") podejdz do gracza

gdy odleglosc mniejsza, zwiększ odleglosc do 32.

gdy odleglosc =32 atakuj.

 

 

Macie może jakieś pomysły na rozwiązanie, bądź też zetknęliście się kiedyś z podobnym problemem i ewentualnym rozwiązaniem?

Odnośnik do komentarza
Udostępnij na innych stronach

Zawsze możesz sprawdzać collision_line'm czy miedzy graczem a przeciwnikiem występuje ściana i atakować tylko gdy nie występuje. Ale to mało realistyczne bo gdy gracz schowa się za ścianę potwór uzna go za niewidzialnego i przestanie go gonić ale zawsze jakieś tam proste AI masz. ;P

 

E. Zawsze jeszcze jest taka opcja http://pl.wikipedia.org/wiki/Algorytm_Dijkstry

Odnośnik do komentarza
Udostępnij na innych stronach

Zawsze możesz sprawdzać collision_line'm czy miedzy graczem a przeciwnikiem występuje ściana i atakować tylko gdy nie występuje. Ale to mało realistyczne bo gdy gracz schowa się za ścianę potwór uzna go za niewidzialnego i przestanie go gonić ale zawsze jakieś tam proste AI masz. ;P

 

E. Zawsze jeszcze jest taka opcja http://pl.wikipedia.org/wiki/Algorytm_Dijkstry

 

 

Bez sensu piszesz. Przecież zaznaczyłem, że użyty będzie atak wręcz, gdy przeciwnik znajduje się BEZPOŚREDNIO przy graczu i to jest JEDYNY moment, kiedy nie ma potrzeby by do niego szedł.

Sprawdzanie w tym momencie czy na linii między AI a graczem występuje kolizja z trzecim obiektem byłoby kompletnie bezcelowe. Wnioskuje więc, że nie chciało Ci się przeczytac przynajmniej 30% tego, co napisałem

 

Jeśli sam nawet tytuł "poruszanie się" jest zbyt mało sugestywny, to zaznacze - chodzi nie o nic więcej niż o poruszanie się przeciwnika. Stopniowe przesuwanie się obiektu z obecnej pozycji, do pozycji gracza, omijając przeszkody. Przy czym poruszać się może tylko w kierunkach wyznaczanych przez 0, 45, 90, 135, 180, 225, 270, 315 stopni obrotu.

 

 

Może uproszczając ogólne pytanie: Czy istnieje możliwość zrobienia tego na ds/mp_gridach lub pathach? I jeśli tak, to czy mogę zostać przynajmniej lekko ukierunkowany jak to zrobić?

Odnośnik do komentarza
Udostępnij na innych stronach

Chciałbym podziękować Wam za ogromny odzew, wsparcie i Wasze zaangażowanie.

 

Względnie przystępne rozwiązanie w skrócie:

 

GML
// obiekt tworzacy siatke. creation code

global.siatka=mp_grid_create(0,0,room_width/32,room_height/32,32,32);

mp_grid_add_instances(global.siatka,obj_wall,false);

 

 

 

//-----------------------------------------------

 

 

 

// obiekt przeciwnik

//creation

sciezka=path_add();

path_set_kind(sciezka,0);

path_set_precision(sciezka,1);

idziedo=false

 

// step

if idzedo=false

{

if distance_to_point(obj_player.x,obj_player.y)<400 && !collision_line(x,y,obj_player.x,obj_player.y,sciana,false,true)

{

idziedo=true;

exit;

}

}

 

 

if idziedo=true

{

path_end();

if distance_to_point(obj_player.x,obj_player.y)>32

{

 

mp_grid_path(global.siatka,sciezka,x,y,obj_player.x,obj_player.y,false);

path_set_kind(sciezka,0);

path_set_precision(sciezka,8);

path_start(sciezka,2,0,false);

}

}

 

// end step

image_angle -= (((((image_angle - point_direction(xprevious,yprevious,x,y)) mod 360) + 540) mod 360) - 180)/(4)

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