Skocz do zawartości

Różne zachowanie obiektów przy tym samym kodzie


odex

Rekomendowane odpowiedzi

Najpierw zacznę po prostu od przykładu by nie przedłużać - https://www.youtube.com/watch?v=FU425Ah3qWU...eature=youtu.be (patrzymy na prawą stronę ekranu).

 

Jak widać jeden statek zachowuje się poprawnie, natomiast drugiego nagle potrzebują jego ludzie. Problem jest taki taki, że kod na poruszanie się obu obiektów jest taki sam (z wyjątkiem szybkości poruszania ale to raczej nie to jest powód jak sądzę).

 

Create:

GML
grid = mp_grid_create(0, 0, room_width div 54, room_height div 54, 54, 54);

mp_grid_add_instances(grid, obj_block, false);

mp_grid_add_instances(grid, obj_block_tinted, false);

mp_grid_add_instances(grid, obj_door, false);

mp_grid_add_instances(grid, obj_blockbutton1, false);

mp_grid_add_instances(grid, obj_blockbutton2, false);

path = path_add();

 

Step:

GML
if canmove = 1 and stop2 = 0 //poruszanie sie

{

 

if mp_grid_path(grid, path, x, y, obj_hitbox.x, obj_hitbox.y, 1)

{

path_start(path, 1.1, 3, 0);

}

}

 

Domyślam się, że gdzieś coś musi być inaczej, problem jest, że nie do końca wiem na co mam zwrócić uwagę, mimo wczorajszych długich poszukiwań. Obj_hitbox to gracz, obj_blockbutton1 i 2 to te kolorowe klocki.

Z góry dzięki każdemu za jakąś sugestię co może być nie tak i gdzie szukać rozwiązania.

Odnośnik do komentarza
Udostępnij na innych stronach

Po pierwsze: Twój grid może być globalny. Każdy instance może korzystać z jednego wspólnego. Dopiero samo mp_grid_path() wykorzystuje inne argumenty.

 

Po drugie zacznij sprawdzać co się dzieje z tymi obiektami. Albo odpal debuger albo wypisuj na ekranie co się teraz dzieje.

Polecam do szybkiego testowania robić tak:

show_debug_message(path_speed)

Wtedy w tej czarnej konsoli na dole IDE GameMakera pojawi się wartość danej zmiennej.

Odnośnik do komentarza
Udostępnij na innych stronach

To w takim razie moje pytanie jest jak działa dokładnie funkcja mp_grid_path. Jeżeli droga do celu jest niemożliwa przez elementy uwzględnione w siatce (jak np klocki w moim filmiku) to wtedy sciezka nie zostaje w ogole utworzona, zostanie utworzona ale nie będzie działać w ogóle, czy też zacznie dopiero działać jak ścieżka będzie dostępna? Bo widzę, ze to ostatnie średnio działa. Więc pytanie- jak zrobić by obiekt ruszył po ścieżce dopiero wtedy gdy będzie ona możliwa.

 

Sorry jak coś niejasno napisałem z góry. Praca + komórka to nie jest najlepszy sposób na pisanie postów :-)

Odnośnik do komentarza
Udostępnij na innych stronach

Funkcja zwróci true oraz przypisze nowo wygenerowany path do podanego w argumencie. Jeżeli droga nie istnieje funkcja nic nie zrobi... ale ten path musi wcześniej istnieć! I to jest problem, bo nawet pusty path ma 2 wierzchołki. Więc być może warunek z jakiegoś powodu jest spełniony i rozpoczynasz path.

 

Czemu się to dzieje? Może twój statek tworzy się i wykonuje sprawdzenie ścieżki zanim wszystkie ściany się pojawią? Postawiłeś go w room na początku, a potem dopiero dodałeś ściany? A potem dodałeś drugi statek i ten już działa? Tak? To masz rozwiązanie.

Odnośnik do komentarza
Udostępnij na innych stronach

To w takim razie na przykładzie poniższego filmiku:

https://www.youtube.com/watch?v=1YZaO1P9eoE...eature=youtu.be

 

Jak widać poradziłem sobie z kwestią uciekania statków poza pokój (co było mocno błahą sprawą i niepotrzebnie w ogóle zakładałem temat w tej sprawie za co przepraszam), jednak dalej jak widać ścieżki nie działają poprawnie. W kodzie, który załączyłem w pierwszym poście, widać że cel jest dla statku wroga by dobrzeć do gracza. Cykl wydarzeń wygląda więc tak:

1. Start roomu - stworzenie ścieżki,

2. Ścieżka jest przyblokowana z każdej strony, bez możliwości dotarcia do celu, GM mówi "nie wiem co robić więc stoimy"

3. Ściany zostają zniszczone, droga robi się dostępna, powinniśmy ruszyć wzdłuż ścieżki po siatce do celu.

 

Problem jest jednak taki, że tak się nie dzieje. Wróg uaktywnia się dopiero wtedy gdy podlecę blisko (co widać na załączonym filmiku), a nawet wtedy jego ścieżka nie działa prawidłowo (taniec w przód i w tył).

Co do kwestii ulokowania obiektów w roomie to ściany zawsze są pierwsze, na końcu wrogowie. Dla pewności pousuwałem wszystkich i dodałem jeszcze raz - efekt taki sam jak widać.

Stąd moje pytanie - gdzie jest mój błąd w logice? Dodam oczywiście, że w przypadku gdy w roomie droga jest dostępna do naszego gracza to wszystko działa bez najmniejszego problemu. Czy jest jakaś funkcja, która może mi wyświetlać ścieżkę na ekranie? I czy cała funkcja mp_grid_path nie powinna działać tak jak rozpisałem w punktach powyżej? Jeśli nie a ja jestem po prostu tępy to w jaki sposób wykonać zamierzony przeze mnie efekt?

 

Z góry dzięki za odpowiedź

Odnośnik do komentarza
Udostępnij na innych stronach

Zobacz draw_path(path, x, y, absolute); oraz mp_grid_draw(id); Obie funkcje w draw mają być no i daj to jakiemuś obiektowi z najniższym depth.

Bo wygląda wszystko ok. Ewentualnie może origin spritów nie masz na środku ale chyba masz bo strzały są dobre.

Odnośnik do komentarza
Udostępnij na innych stronach

draw_path:

https://www.youtube.com/watch?v=DKFMutbEN2o...eature=youtu.be

 

Jak widać ścieżka zostaje zerwana w miejscu gdzie wcześniej znajdowały się te czerwone/zielone klocki.

 

Potwierdza to też mp_grid_draw. Tutaj jednak już widzę, że nawet po zniszczeniu tych czerwonych klocków, region w którym one stały dalej jest zaznaczony na czerwono (jako niedostępny). Ma to sens o tyle, że wrogi statek zaczyna mnie atakować dopiero gdy podlecę do niego za te kolorowe klocki, a gdy z nich wylecę to ścieżka przestaje funkcjonować. Więc pytanie - czy to normalne, że usunięcie bloków nie wykreśla ich jednocześnie z siatki? Czy ja po prostu zrobiłem coś nie tak?

Odnośnik do komentarza
Udostępnij na innych stronach

Funkcja mp_grid_clear_rectangle działa, jednak teraz muszę przebudować swój cały system siatki na jedną globalną. Dla pewności w związku z tym zapytam od razu - czy jest jakiś bardziej optymalny sposób czy tamte funkcja to jest to co powinienem używać w tej sytuacji. Wiem, że jest jeszcze mp_grid_clear_cell ale ona odwołuje się bezpośrednio do komórek siatki, więc rectangle łatwiej mi po prostu usunąć te miejsca, które trzeba.

 

Od razu dopytam też - jak zrobić by dwa takie same statki nie mogły być w tej samej komórce? Bo jak dodam do mp_grid_add_instances to wróg przestaje się całkowicie ruszać (co ma sens bo sam jest niedozwoloną komórką).

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