bartas Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 GML path_delete( path );Nie? I zaraz po tym nową w to miejsce. =P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 Wtedy gdy rozpoczyna się akcja powrotu pogotowia to wyskakuje błąd: ___________________________________________ ERROR in action number 1 of Step Event for object pogotowie: Trying to assign to a non-existing path. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 Ograniczyłem i się wykonuje tylko raz i tnie słabiej ale jednak widać różnicę Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 Widać gdzieś jeszcze robisz to samo. :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 Zobaczę we wszystkich obiektach czy otwiera en skrypt i dam w edicie ;) EDIT: Tylko obiekt pogotowie wykorzystuje ten skrypt 1 raz :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 Może dużo obiektów bierze udział w tym wszystkim? Np. jeśli jest dużo obiektów robiących za "ściany" to też może mulić. =) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 Łołoło w mojej grze będzie sporawo ścian i obiektów :| Chyba muszę się przyzwyczaić do mulenia :( Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Tymon Opublikowano 24 Lutego 2008 Udostępnij Opublikowano 24 Lutego 2008 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 Więcej opcji udostępniania...
bartas Opublikowano 24 Lutego 2008 Autor Udostępnij Opublikowano 24 Lutego 2008 Dobra działają tylko teraz gdy drugi raz w coś walne to pogotowie nie reaguje :/ Wcześniej gdy się tak cięło to reagowało :/ Edit: Działa wszystko :) Closed :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi