Skocz do zawartości

Zablokowane Jak usunąć path?


bartas

Rekomendowane odpowiedzi

Robię grę na przykładzie: "Znajdywanie drogi". Mam obiekt player i obiekt pogotowie. Zrobiłem tak że przy wypadku pogotowie jedzie do playera i wraca. Problem w tym że gra przy tym strasznie muli :/. Myślę że problem leży w tym że gdy pogotowie skończy swoje zadanie to nie usuwa patcha.

Na końcu skryptu znajdowania drogi mam:

 

GML
path_end();

path_clear_points(Path2);

 

Ale to nic nie daje :/ Gra nadal muli. Próbowałem także usunąć pogotowie po zakończeniu całej operacji ale i to nic nie dało :(

Macie jakieś pomysły??

Odnośnik do komentarza
Udostępnij na innych stronach

To jest tak, znajdujesz drogę i wtedy tworzy Ci nowego patha, po przejściu patha go kasujesz, a gdy znowu chcesz gdzieś iść to robisz wszystko od początku... znajdujesz drogę... bla bla.

Inaczej po prostu będziesz niszczył używanego patha.

Odnośnik do komentarza
Udostępnij na innych stronach

właśnie tak zrobiłem

Po przyjeździe pogotowia na miejsce wypadku to kasuje Patha odpowiadającego za przyjazd karetki i rozpoczyna znajdowanie drogi powrotu. Gdy znajdzie to nią jedzie i po powrocie kasuje Path2. I właśnie po rozpoczęciu drogi powrotnej wyskakuje ten błąd :/

 

EDIT: Mam tak

 

Path

zakończenie Patha

kasowanie Patha

szukanie drogi powrotnej

Rozpoczęcie powrotu

Kasowanie Path2

 

I ten błąd wyskakuje przy "szukanie drogi powrotnej"

Odnośnik do komentarza
Udostępnij na innych stronach

Weź rzuć mi to co masz na PW, albo jakoś tak. Po prostu bez podglądu kodu trudno jest mi cokolwiek powiedzieć. =)

Może tylko nie zwalniasz obiektu z używanego patha. I wtedy byk.

 

Może też po prostu problemem jest to, że rozdzielasz pathe na dwa oddzielne. Weź potraktuj Path i Path2 jako jeden - w jednej zmiennej.

Odnośnik do komentarza
Udostępnij na innych stronach

To dam tutaj kod tego skryptu:

Kod był modyfikowany i przepisywany a nie kopiowany!

 

GML
//WYSZUKANIE DROGI

{

//RESET ---------------------------------------------------------------------------------------------------------------------------

path_end(); //stop!

path_clear_points(Path); //czyścimy ścieżkę

with(Point)instance_destroy(); //czyścimy znaczniki

with(Goal)instance_destroy();

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

//WYSZUKIWANIE --------------------------------------------------------------------------------------------------------------------

global.Grid = mp_grid_create(0,0,153,198,16,16); //twożymy nową siatkę

mp_grid_add_instances(global.Grid,Obstacle,true); //komórki zajęte przez obiekt Obstacle ustaw jako niedozwolone

global.Ready = mp_grid_path(global.Grid,Path,x,y,(global.Pozycjax div 16*16)+8,(global.Pozycjay div 16*16)+8,true); //wyszukaj ścieżkę i daj znać czy znalazłeś czy nie do zmiennej Ready

path_set_kind(Path,true); //ustaw gładkie krawędzie ścieżki

mp_grid_destroy(global.Grid); //wywal siatkę

/*

Ja jestem zwolennikiem wywalania wszystkiego co niepotrzebne, ale jeśli chcesz to możesz utworzenie siatki oraz dodanie

komórek niedozwolonych wstawić do zdarzenia Create i nie usówać siatki przez cały czas życia obiektu Player.

*/

 

global.PathWidth = path_get_number(Path)-1;//zapamietaj długość ścieżki

/*

Po to aby nie wywoływać 3 razy funkcji path_get_number() w dalszej części skryptu.

Uczmy się oszczędzać moc przerobową procka :)

-----------------------------------------------------------------------------------------------------------------------------------

*/

 

if(global.Ready) //jeśli znalazł ścieżkę

{

instance_create(path_get_point_x(Path,global.PathWidth),path_get_point_y(Path,global.PathWidth),Goal); //pokaż znacznik punktu docelowego

//pokaż znaczniki ścieżki

for(i=0;i<global.PathWidth;i+=1)

instance_create(path_get_point_x(Path,i),path_get_point_y(Path,i),Point);

}

/*else

show_message('To miejsce jest niedostepne!'); //jeśli nie istnieje ścieżka, to powiedz o tym graczowi. */

 

 

//RUCH

if global.Ready//jak sobie klikniesz i już znaleziono ścieżkę to...

{

path_start(Path,10,0,true); //jazda!

global.Ready = false;

}

if global.powrot = 1

{

path_end(); //stop!

path_clear_points(Path); //czyścimy ścieżkę

with(Point)instance_destroy(); //czyścimy znaczniki

with(Goal)instance_destroy();

path_delete(Path);

 

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

//WYSZUKIWANIE --------------------------------------------------------------------------------------------------------------------

global.Grid = mp_grid_create(0,0,153,198,16,16); //twożymy nową siatkę

mp_grid_add_instances(global.Grid,Obstacle,true); //komórki zajęte przez obiekt Obstacle ustaw jako niedozwolone

global.Ready = mp_grid_path(global.Grid,Path2,x,y,(global.spozycjax div 16*16)+8,(global.spozycjay div 16*16)+8,true); //wyszukaj ścieżkę i daj znać czy znalazłeś czy nie do zmiennej Ready

path_set_kind(Path2,true); //ustaw gładkie krawędzie ścieżki

mp_grid_destroy(global.Grid); //wywal siatkę

/*

Ja jestem zwolennikiem wywalania wszystkiego co niepotrzebne, ale jeśli chcesz to możesz utworzenie siatki oraz dodanie

komórek niedozwolonych wstawić do zdarzenia Create i nie usówać siatki przez cały czas życia obiektu Player.

*/

 

global.PathWidth = path_get_number(Path2)-1;//zapamietaj długość ścieżki

/*

Po to aby nie wywoływać 3 razy funkcji path_get_number() w dalszej części skryptu.

Uczmy się oszczędzać moc przerobową procka :)

-----------------------------------------------------------------------------------------------------------------------------------

*/

 

if(global.Ready) //jeśli znalazł ścieżkę

{

instance_create(path_get_point_x(Path2,global.PathWidth),path_get_point_y(Path2,global.PathWidth),Goal); //pokaż znacznik punktu docelowego

//pokaż znaczniki ścieżki

for(i=0;i<global.PathWidth;i+=1)

instance_create(path_get_point_x(Path2,i),path_get_point_y(Path,i),Point);

}

//RUCH

if global.Ready//jak sobie klikniesz i już znaleziono ścieżkę to...

{

path_start(Path2,10,0,true); //jazda!

global.Ready = false;

path_delete(Path2);

 

 

}

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

GML
//WYSZUKANIE DROGI

if global.powrot = 0

{

//RESET

path_end(); //stop!

path_clear_points(Path); //czyścimy ścieżkę

with(Point)instance_destroy(); //czyścimy znaczniki

with(Goal)instance_destroy();

 

//WYSZUKIWANIE

global.Grid = mp_grid_create(0,0,153,198,16,16); //twożymy nową siatkę

mp_grid_add_instances(global.Grid,Obstacle,true); //komórki zajęte przez obiekt Obstacle ustaw jako niedozwolone

global.Ready = mp_grid_path(global.Grid,Path,x,y,(global.Pozycjax div 16*16)+8,(global.Pozycjay div 16*16)+8,true); //wyszukaj ścieżkę i daj znać czy znalazłeś czy nie do zmiennej Ready

path_set_kind(Path,true); //ustaw gładkie krawędzie ścieżki

mp_grid_destroy(global.Grid); //wywal siatkę

global.PathWidth = path_get_number(Path)-1;//zapamietaj długość ścieżki

if(global.Ready) //jeśli znalazł ścieżkę

{

instance_create(path_get_point_x(Path,global.PathWidth),path_get_point_y(Path,global.PathWidth),Goal); //pokaż znacznik punktu docelowego

//pokaż znaczniki ścieżki

for(i=0;i<global.PathWidth;i+=1)

instance_create(path_get_point_x(Path,i),path_get_point_y(Path,i),Point);

}

 

 

if global.Ready//jak sobie klikniesz i już znaleziono ścieżkę to...

{

path_start(Path,10,0,true); //jazda!

global.Ready = false;

}

}

else

if global.powrot = 1

{

path_end(); //stop!

path_clear_points(Path); //czyścimy ścieżkę

with(Point)instance_destroy(); //czyścimy znaczniki

with(Goal)instance_destroy();

path_delete(Path);

 

//WYSZUKIWANIE

global.Grid = mp_grid_create(0,0,153,198,16,16); //twożymy nową siatkę

mp_grid_add_instances(global.Grid,Obstacle,true); //komórki zajęte przez obiekt Obstacle ustaw jako niedozwolone

global.Ready = mp_grid_path(global.Grid,Path,x,y,(global.spozycjax div 16*16)+8,(global.spozycjay div 16*16)+8,true); //wyszukaj ścieżkę i daj znać czy znalazłeś czy nie do zmiennej Ready

path_set_kind(Path,true); //ustaw gładkie krawędzie ścieżki

mp_grid_destroy(global.Grid); //wywal siatkę

global.PathWidth = path_get_number(Path)-1;//zapamietaj długość ścieżki

if(global.Ready) //jeśli znalazł ścieżkę

{

instance_create(path_get_point_x(Path,global.PathWidth),path_get_point_y(Path,global.PathWidth),Goal); //pokaż znacznik punktu docelowego

//pokaż znaczniki ścieżki

for(i=0;i<global.PathWidth;i+=1)

instance_create(path_get_point_x(Path,i),path_get_point_y(Path,i),Point);

}

 

//RUCH

if global.Ready//jak sobie klikniesz i już znaleziono ścieżkę to...

{

path_start(Path,10,0,true); //jazda!

global.Ready = false;

}

}

Sprawdź.

 

BTW. może ukrócona wersja:

GML
//WYSZUKANIE DROGI

if global.powrot = 1

{

TX = (global.spozycjax div 16*16)+8;

TY = (global.spozycjay div 16*16)+8;

}

else

{

TX = (global.Pozycjax div 16*16)+8;

TY = (global.Pozycjay div 16*16)+8;

}

 

//RESET

path_end(); //stop!

path_clear_points(Path); //czyścimy ścieżkę

with(Point)instance_destroy(); //czyścimy znaczniki

with(Goal)instance_destroy();

 

//WYSZUKIWANIE

global.Grid = mp_grid_create(0,0,153,198,16,16); //twożymy nową siatkę

mp_grid_add_instances(global.Grid,Obstacle,true); //komórki zajęte przez obiekt Obstacle ustaw jako niedozwolone

global.Ready = mp_grid_path(global.Grid,Path,x,y,TX,TY,true); //wyszukaj ścieżkę i daj znać czy znalazłeś czy nie do zmiennej Ready

path_set_kind(Path,true); //ustaw gładkie krawędzie ścieżki

mp_grid_destroy(global.Grid); //wywal siatkę

global.PathWidth = path_get_number(Path)-1;//zapamietaj długość ścieżki

if(global.Ready) //jeśli znalazł ścieżkę

{

instance_create(path_get_point_x(Path,global.PathWidth),path_get_point_y(Path,global.PathWidth),Goal); //pokaż znacznik punktu docelowego

//pokaż znaczniki ścieżki

for(i=0;i<global.PathWidth;i+=1)

instance_create(path_get_point_x(Path,i),path_get_point_y(Path,i),Point);

}

 

 

if global.Ready//jak sobie klikniesz i już znaleziono ścieżkę to...

{

path_start(Path,10,0,true); //jazda!

global.Ready = false;

}

Odnośnik do komentarza
Udostępnij na innych stronach

To samo :/

Może dam jeszcze kod pogotowia?? Może w tym leży problem ponieważ w błędzie jest wymieniana nazwa pogotowia:

Create:

 

GML
global.Ready = false; //przechowuje true jeśli znaleziono ścieżkę lub false jeśli nie

global.Grid = false; //indeks siatki

global.PathWidth = false; //długość ścieżki (zmienne pomocnicza)

Path = path_add(); //utwórz ścieżkę i zapamiętaj jej indeks

global.stworzony = 1

global.zemjest = 1

global.spozycjax = x

global.spozycjay = y

global.powrot = 0

 

Path2 = path_add(); //utwórz ścieżkę i zapamiętaj jej indeks

 

Step:

GML
if global.stworzony = 1 // jeżeli obiekt jest stworzony to...

{

script_execute(GG_droga) //...otwiera skrypt

}

if position_meeting(368,128,pogotowie) //jeżeli pozycja obiektu jest zajeta to...

{

global.zemjest = 0 //zmienna odpowiadająca za tworzenie obiektu zmienia sie na 0

}

if global.zemjest = 0 //jezeli zmienna odpowiadająca za tworzenie obiektu jest równa 0 to...

{

global.wypadek = 0 // zmienna wypadek = 0

}

if position_meeting(global.Pozycjax,global.Pozycjay,pogotowie) // jezeli pozycja x i y jest zajeta to...

{

global.powrot = 1 //... powrot = 1

}

if global.powrot = 1 // jezeli powrot = 1 to...

{

global.wypadek = 0 //... globalna wypadek = 0

global.zemjest = 0 // i zemjest = 0

}

if global.wypadek = 0 && global.zemjest = 0 // jezeli zmienna wypadek i zemjest są równe 0 to...

{

script_execute(GG_droga) //... wraca do szpitala xD

}

 

 

GG_droga to skrypt który jest wyżej

 

EDIT: Dzięki!! :] Skrócona forma działa idealnie :D

 

EDIT2: Nie do końca :/ Na większych odległościach tnie tak samo :/

Odnośnik do komentarza
Udostępnij na innych stronach

Bo to wina kodu który masz w step. Cały czas wykonujesz GG_droga i po prostu GM liczy to samo wiele razy. Ogranicz nieco skrypt by wykonywał się tylko raz, albo zmień eventa.

Najlepiej to przeanalizuj jeszcze raz jego działanie sam i pomyśl, że robi to 30 razy w ciągu sekundy. ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Możesz ewentualnie zrobić tak:

CREATE

GML
global.Grid = mp_grid_create(0,0,153,198,16,16); //twożymy nową siatkę

mp_grid_add_instances(global.Grid,Obstacle,true); //komórki zajęte przez obiekt Obstacle ustaw jako niedozwolone

GG_droga

GML
//WYSZUKANIE DROGI

if global.powrot = 1

{

TX = (global.spozycjax div 16*16)+8;

TY = (global.spozycjay div 16*16)+8;

}

else

{

TX = (global.Pozycjax div 16*16)+8;

TY = (global.Pozycjay div 16*16)+8;

}

 

//RESET

path_end(); //stop!

path_clear_points(Path); //czyścimy ścieżkę

with(Point)instance_destroy(); //czyścimy znaczniki

with(Goal)instance_destroy();

 

//WYSZUKIWANIE

global.Ready = mp_grid_path(global.Grid,Path,x,y,TX,TY,true); //wyszukaj ścieżkę i daj znać czy znalazłeś czy nie do zmiennej Ready

path_set_kind(Path,true); //ustaw gładkie krawędzie ścieżki

global.PathWidth = path_get_number(Path)-1;//zapamietaj długość ścieżki

if(global.Ready) //jeśli znalazł ścieżkę

{

instance_create(path_get_point_x(Path,global.PathWidth),path_get_point_y(Path,global.PathWidth),Goal); //pokaż znacznik punktu docelowego

//pokaż znaczniki ścieżki

for(i=0;i<global.PathWidth;i+=1)

instance_create(path_get_point_x(Path,i),path_get_point_y(Path,i),Point);

}

 

 

if global.Ready//jak sobie klikniesz i już znaleziono ścieżkę to...

{

path_start(Path,10,0,true); //jazda!

global.Ready = false;

}

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...