HyperFrosty Opublikowano 21 Listopada 2009 Udostępnij Opublikowano 21 Listopada 2009 Witam. Mam, krótko mówiąc, problem i chciałbym go mimo wszystko rozwiązać. Chodzi o poszukiwanie ścieżki do danego punktu (cel_x, cel_y), jednakże jest pewne ograniczenie, wynoszące ileś tam stepów (ruch),(1 step=32, logicznie). Moim zamysłem było stworzenie najpierw ścieżki a potem za pomocą WHILE przesuwać się z ostatniego punktu w ścieżce do przedostatniego i potem stworzyć znowu ścieżkę, gdzie celem będzie właśnie ten przedostatni. I takie zapętlenie miało być spełnione aż do momentu, kiedy długość ścieżki wynosiła nie więcej niż RUCH (ileś tam stepów, u mnie akurat są to 3). Być może niezbyt to łopatologiczne, ale finał miał być taki, że dany obiekt przesuwał się aż do momentu, kiedy jego dystans od punktu początkowego wynosi 3 stepy. Algorytm poszukiwania ścieżki już mam, chodzi mi o samo znalezienie ścieżki do maksymalnego możliwego punktu. GML cel_x=player.x; cel_y=player.y-32; if(cel_x!=0 && cel_y!=0) { myPath1 = AStar_findPath(x,y,cel_x,cel_y,1); znaleziony=false; ostatni_punkt=0; zmienna1=0; while(znaleziony==false) { myPath1 = AStar_findPath(x,y,cel_x,cel_y,1); if (path_get_length(myPath1)!=0) { zmienna1=1-((ostatni_punkt*32) div path_get_length(myPath1)); } if(path_get_length(myPath1) div 32<ruch) { znaleziony=true; path_start(myPath1,4,0,0); break; } else { ostatni_punkt+=1; cel_x=path_get_x(myPath1,zmienna1) cel_y=path_get_y(myPath1,zmienna1) } } } Być może czegoś nie dopisałem, o czymś zapomniałem. Nie wiem. Od kilku włączeń Game Makera chodzi mi to po głowie, a sam tego problemu już chyba nie jestem w stanie rozwiązać. Pomocy, proszę. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Marek.S Opublikowano 21 Listopada 2009 Udostępnij Opublikowano 21 Listopada 2009 nie zagłębiałem się, ale zamiast pętli while daj warunek, bo tak wszystko wykona Ci się w jednym stepie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
HyperFrosty Opublikowano 21 Listopada 2009 Autor Udostępnij Opublikowano 21 Listopada 2009 Już chyba mam, ale pojawił się teraz problem innej kategorii. Jednakże, do czego doszedłem: GML ostatni_punkt+=1; <- to wyrzuciłem zmienna1=1-((ostatni_punkt*32) div path_get_length(myPath1)); cel_x=path_get_x(myPath1,zmienna1) cel_y=path_get_y(myPath1,zmienna1) myPath1 = AStar_findPath(x,y,cel_x,cel_y,1); Dzięki temu za każdym razem zmienna1 nie będzie się zmniejszać o coraz większą liczbę. Po zmianach kod wygląda tak: GML do { zmienna1=1-(32 div path_get_length(myPath1)); cel_x=path_get_x(myPath1,zmienna1) cel_y=path_get_y(myPath1,zmienna1) myPath1 = AStar_findPath(x,y,cel_x,cel_y,1); } until (path_get_length(myPath1)<= ruch*32) path_start(myPath1, 4, 0, 0); Teraz pytanie o zmienna1 - wynik będzie liczbą niewymierną. Natomiast by uzyskać cel_x i cel_y korzystam z funkcji path_get_x i nie wiem, czy aby ona nie wymaga liczby wymiernej. Co dalej? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
HyperFrosty Opublikowano 22 Listopada 2009 Autor Udostępnij Opublikowano 22 Listopada 2009 Dobra. Nie rozwiązałem problemu, ale obszedłem go na około: GML if(cel_x!=0 && cel_y!=0) { myPath1 = AStar_findPath(x,y,cel_x,cel_y,1); cel_x=path_get_point_x(myPath1,ruch) cel_y=path_get_point_y(myPath1,ruch) myPath1 = AStar_findPath(x,y,cel_x,cel_y,1); path_start(myPath1, 4, 0, 0); } Teraz po prostu szuka od razu ścieżki o długości równej wartości RUCH, bez używania wszelakiego rodzaju niepotrzebnego zapętlenia. Jednakże mam teraz problem z samym skryptem AStar_findPath, ale myślę, że się z nim uporam ;). 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ę