Naoh Opublikowano 23 Września 2012 Udostępnij Opublikowano 23 Września 2012 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 Więcej opcji udostępniania...
Lechu4444 Opublikowano 23 Września 2012 Udostępnij Opublikowano 23 Września 2012 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 Więcej opcji udostępniania...
Naoh Opublikowano 23 Września 2012 Autor Udostępnij Opublikowano 23 Września 2012 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 Więcej opcji udostępniania...
Naoh Opublikowano 27 Września 2012 Autor Udostępnij Opublikowano 27 Września 2012 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 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ę