Skocz do zawartości

Szukanie ścieżki z ograniczeniem do kilku stepów


HyperFrosty

Rekomendowane odpowiedzi

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

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

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

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