Skocz do zawartości

Kolejność eventów


TO_mek

Rekomendowane odpowiedzi

Witam!

Załóżmy że zmienna "zmienna" jest globalna.

Czy jak wpisze w jednym obiekcie w step zmienna=0 i w tym samym obiekcie w evencie kolizji z innym obiektem zmienna=1 to czy wykona mi się kod w step jeśli wpisze w nim na samym końcu if zmienna == 1 then wykonaj_costam()? Pewnie nie bo w tym samym kroku w stepie nadaje zmiennej 0 i oczekuje ze będzie miała za chwile 1 z kolizji.

 

To inaczej, potrzebuje by w momencie gdy jest kolizja, "zmienna" była równa 1 i wykonywał się kod w step ale w momencie gdy już kolizji nie będzie to "zmienna" powracała do wartości 0. Powyższy przykład w step odpada bo na logikę nigdy się nie wykona. W momencie kolizji nadanie zmiennej wartości 1 to nie problem ale jak mam wykryć brak tej kolizji i nadawać ponownie wartość 0?

 

Kolizje wykrywam poprzez dodanie AddEvent->Collision z wybranym obiektem a następnie dodaje kod i w nim w kodzie wpisuje zmienna:=1;, obiekty na razie nie są solid.

 

EDIT:

Ok sprawdziłem, że powyższy sposób nie zadziała ale w momencie gdy w step wpisałem najpierw warunek if zmienna==1 then costam a dopiero w kolejnej linii zmienna:=0; to wtedy warunek jest wykonywany. Czyli wychodzi na to, że najpierw leci step obiektu a potem leci kolizja która nadaje wartość 1 i w następnym przejściu w step na dzień dobry mamy wartość 1 i wykonuje warunek a dopiero potem nadaje zmiennej 0. No ok to to mniej więcej działa (z opóźnieniem jednego kroku) ale co w przypadku gdy:

kolizja wykrywana będzie w obiekcie1 a warunek postawiony w zupełnie innym obiekcie? Jak tutaj wygląda wykonywanie eventów? Czy najpierw wykonywane są wszystkie warunki jednego typu dla wszystkich obiektow, później kolejne eventy wszystkich obiektow itd. czy najpierw leci cały obiekt ze wszystkimi eventami, potem następny obiekt itd.?

No i co decyduje o kolejności wykonywania zdarzeń w danych obiektach tzn. który obiekt wykonuje działania jako pierwszy? Czy to leci wg depth (a co jak obiekty mają tą samą wartość depth) czy może wg tego w jakiej kolejności są definiowane obiekty w edytorze albo w jakiej kolejności są utworzone w grze (no to jak tak to znowu pytanie co leci pierwsze czy obiekty zdefiniowane na roomie już w edytorze czy może w evencie create rooma albo jak)?

Odnośnik do komentarza
Udostępnij na innych stronach

Step -> End Step. Wpisany tam kod wykona się po Stepie i po kolizji, ale przed Drawem.

 

E: nie ma tak, że najpierw jeden obiekt wykona wszystkie eventy, potem drugi obiekt, trzeci itd. Najpierw wszystkie obiekty, po kolei (poczynając od tego z najmniejszym id, czyli tego stworzonego jako pierwszy) wykonają jeden event, potem po kolei drugi, trzeci itd.

Odnośnik do komentarza
Udostępnij na innych stronach

To powinno rozwiać twoje wątpliwości co do wykonywania kolejności kodu w GMie: kolejność wykonywania eventów

 

EDIT:

No i co decyduje o kolejności wykonywania zdarzeń w danych obiektach tzn. który obiekt wykonuje działania jako pierwszy? Czy to leci wg depth (a co jak obiekty mają tą samą wartość depth) czy może wg tego w jakiej kolejności są definiowane obiekty w edytorze albo w jakiej kolejności są utworzone w grze (no to jak tak to znowu pytanie co leci pierwsze czy obiekty zdefiniowane na roomie już w edytorze czy może w evencie create rooma albo jak)?

kolejność jest chyba ustala przez id instancji rosnąco ale tego nie sprawdzałem więc to tylko przypuszczenie.

Odnośnik do komentarza
Udostępnij na innych stronach

Step -> End Step. Wpisany tam kod wykona się po Stepie i po kolizji, ale przed Drawem.

 

Faktycznie tak działa. Tylko jestem trochę zaskoczony bo już wielokrotnie spotkałem się z opinią że eventy wykonują się w tej kolejności w jakiej pojawiają się w oknie Events: (nieważne co się pierwsze wybierze to i tak kolejność w jakiej ułożą się eventy jest stała). A tutaj event EndStep układa się zaraz PO step ale PRZED kolizjami co obala powyższą teorię!

No ale dalej mam dylemat jak to zadziała gdy wiele obiektów będzie odwoływać się do tej samej zmiennej globalnej - czy najpierw lecą wszystkie step potem wszystkie kolizje a potem wszystkie endstep czy leca po kolei "całe" obiekty po obiekcie. No i w jakiej kolejności?

 

A może w steep dać kod sprawdzający kolizje w danym momencie i bezpośrednio po tym wykonać działanie? Tylko że te funkcje (place_meeting(x,y,obj) czy collision_point(x,y,obj,prec,notme)) sprawdzają kolizje punktowo (origin) a to mnie za bardzo nie urządza bo mój obiekt (który by sprawdzał kolizje z innymi obiektami) jest dosyć niekształtny.

Odnośnik do komentarza
Udostępnij na innych stronach

Co do funkcji sprawdzających kolizje, możesz użyć place_free i place_empty.

czy najpierw lecą wszystkie step potem wszystkie kolizje a potem wszystkie endstep czy leca po kolei "całe" obiekty po obiekcie. No i w jakiej kolejności?

Najpierw wszystkie Step, potem kolizje, potem End Step.

HuderLord podał kolejność.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok drugi test: tym razem z uwzględnieniem paru instancji jednego obiektu. kolejność eventów 2

 

I wychodzi na to że eventy są pogrupowane tzn. zanim wykona się następny typ eventu to najpierw wszystkie instancje zgodnie z ich rosnącym id wykonują aktualny typ eventu.

zamieszanie jest tylko z eventem create a object creation.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok drugi test: tym razem z uwzględnieniem paru instancji jednego obiektu. kolejność eventów 2

 

I wychodzi na to że eventy są pogrupowane tzn. zanim wykona się następny typ eventu to najpierw wszystkie instancje zgodnie z ich rosnącym id wykonują aktualny typ eventu.

zamieszanie jest tylko z eventem create a object creation.

 

 

create w kolejnosci w jakiej sa tworzone obiekty na roomie (ale nie jak w edytorze)

draw j.w.

begin step - grupuje i wykonuje kopie obiektu ALE WCALE NIE TE O najnizszym ID (TE CO BYLY PIERWSZE W CREATE) ale te co byly pierwsze utworzone w edytorze a potem kolejne obiekty innego typu i jego kopie itd. - u mnie obiekt nr 1 wykonuje sie pierwszy! a utworzony byl w edytorze jako pierwszy ale w create jako drugi (majacy ID wyzszy o 1 od najnizsego) oraz obiekt nr2 utworzony jako drugi w edytorze ale jako pierwszy w create (majacy najnizszy nr ID)

step j.w !

kolizje j.w.

 

Masakra.

 

Przy wiekszej ilosci obiektow takze to sie sprawdza czyli decyduje kolejnosc tworzenia obiektow w edytorze.

Zmiana kolejnosci obiektwow w edytorze NIE MA WPLYWU na zmiane kolenosci wykonywania (a przy duzej ilosci obiektow zazwyczaj kazdy tworzy sobie podkatalogi na obiekty, usuwa, zamienia, kopiuje itd - i kto by pamietal ktory z tych obiektow byl utworzony w edytorze jako pierwszy!)

 

To jeszcze czy na coś ma wpływ depth.

Masakra do kwadratu!

Depth ma wpływ ale WYŁĄCZNIE na event DRAW i wyświetla się zawsze grupa obiektów o najwyzszej wartosci depth zaczynajac od najnizszej wartosci ID w danej grupie.

 

No to powodzenia w zapanowaniu nad tym wszystkim :)

 

EDIT:

Testowane na GM8

Odnośnik do komentarza
Udostępnij na innych stronach

 

OK. Kolejność eventów mamy już ustaloną ale tak jak napisałem posta wyżej testy pokazują, że instancje tego samego obiektu, parametr depth oraz kolejność tworzenia obiektu w samym edytorze ma ogromne znaczenie i także jest zupełnie inne w zależności od eventu jakiego dotyczy, więc sprawa kolejności wykonywania zdarzeń wcale nie jest tak płytka jak w tym temacie który przytoczyłeś.

 

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Parametr depth(ang. "głębokość") dotyczy głębi rysowania. Jeżeli dwie instancje nakładają się na siebie i mają różny depth, wtedy na wierzchu rysowana jest ta, z niższym parametrem depth.

Jeżeli mają ten sam depth wtedy o kolejności rysowania decyduje ID, czyli indywidualny numer każdej kolejnej instancji. Na wierzchu pozostaje wtedy "młodsza" instancja.

 

Jak wynika z mojego małego eksperymentu, parametr depth ma ważniejsze, niż ID znaczenie.

Experyment.png

Zielony został stworzony wcześniej, niż czerwony. Ma więc niższe ID i teoretycznie ustawiona przez niego zmienna globalna "kanapka" na wartość 0 powinna zostać zamieniona na wartość, nadawaną przez czerwony kwadracik. Tymczasem global.kanapka ma wartość 0. Dowodzi to, że kod wykonywany jest najpierw w głębszych warstwach rysowania, czyli tam, gdzie parametr depth ma większą wartość, a następnie w warstwach "bliższych użytkownikowi".

 

Dla niedowiarków:

Experyment.gmk (GMClan.org)

Odnośnik do komentarza
Udostępnij na innych stronach

@Mentoss: Twój eksperyment nic nie udowadnia, potwierdziłeś tylko to co wszyscy wiedzą. Natomiast nie ma nic wspólnego z kolejnością wykonywania eventów (tzn. nie potwierdza ani nie zaprzecza temu że depth ma wpływ na kolejnośc wykonywania eventa w różnych obiektach)

Odnośnik do komentarza
Udostępnij na innych stronach

@M@ILOSZ

Twój post za to nie wniósł dosłownie NICZEGO poza wniesieniem, że mój nie wniósł...

 

Z tym za to się nie zgodzę. Mój post uzupełnił informacje dot. parametru depth. Teraz każdy debil (no, może nie każdy) może z łatwością zrozumieć jak go użyć, oraz znaleźć dla niego jakieś ciekawe zastosowanie. Dodatkowo wykazałem, że:

OK. Kolejność eventów mamy już ustaloną ale tak jak napisałem posta wyżej testy pokazują, że instancje tego samego obiektu, parametr depth oraz kolejność tworzenia obiektu w samym edytorze ma ogromne znaczenie i także jest zupełnie inne w zależności od eventu jakiego dotyczy, więc sprawa kolejności wykonywania zdarzeń wcale nie jest tak płytka jak w tym temacie który przytoczyłeś.
"sprawa kolejności wykonywania wydarzeń" JEST prosta.

Najpierw wykonują się beginstepy w kolejności ID w "najdalszych" warstwach.

Potem przechodzi przez kolejne warstwy na wierzch, za każdym razem TYLKO beginstepy, za każdym w kolejności ID.

Jak już przejdzie przez najbliższą warstwę wykonywany jest kolejny ev., znów zaczynając od najdalszych z najniższymi ID poprzez coraz to niższe depthy kończąc na najbliższym.

 

I tak z każdym ev., wg. kolejności.

 

To jest proste, a każdy z moich postów z osobna wniósł więcej, niż ty, M@iloszu, w całym temacie... A tak. Twoim jedynym postem było nic nie wnoszące stwierdzenie, że mój post nic nie wnosi.

 

Edit:

A... stwierdzenie "nie każdy debil" nie miało na celu nikogo obrazić.

Odnośnik do komentarza
Udostępnij na innych stronach

Lolmentos, jesteś epicki : D

 

Filozofujesz na siłę, nie żadne magiczne "jeśli się nakładają i mają różny depth to ta z mniejszym narysuje się na tej z większym" i "najpierw wykonują się beginstepy w kolejności id w najdalszych warstwach", tylko po prostu "instancje są sortowane po depthu", i to Ci rozwiązuje wszystkie pytania. Instancje z mniejszym depthem rysują się "wyżej" dlatego, że rysują się później, jeśli mają taki sam depth to "wyżej" narysuje się ta wcześniejsza dlatego, że tylko depth jest wyznacznikiem przy sortowaniu - jeśli depth jest taki sam to dwie instancje nie zmieniają się miejscami -> później utworzone rysują się później. A wszystkie eventy wykonują się w takiej samej kolejności co Draw bo zwyczajnie nie opłaca się zmieniać kolejności rysowania dwa razy na klatkę jak i tak nic by to nie zmieniło.

Po to są te wszystkie Beign Stepy Stepy i End Stepy aby po nich rozróżniać kolejność i nie zagłębiać się w to w jakiej kolejności wykonują się eventy.

Odnośnik do komentarza
Udostępnij na innych stronach

Filozofujesz na siłę, nie żadne magiczne "jeśli się nakładają i mają różny depth to ta z mniejszym narysuje się na tej z większym" i "najpierw wykonują się beginstepy w kolejności id w najdalszych warstwach", tylko po prostu "instancje są sortowane po depthu", i to Ci rozwiązuje wszystkie pytania. Instancje z mniejszym depthem rysują się "wyżej" dlatego, że rysują się później, jeśli mają taki sam depth to "wyżej" narysuje się ta wcześniejsza dlatego, że tylko depth jest wyznacznikiem przy sortowaniu - jeśli depth jest taki sam to dwie instancje nie zmieniają się miejscami -> później utworzone rysują się później. A wszystkie eventy wykonują się w takiej samej kolejności co Draw bo zwyczajnie nie opłaca się zmieniać kolejności rysowania dwa razy na klatkę jak i tak nic by to nie zmieniło.

Po to są te wszystkie Beign Stepy Stepy i End Stepy aby po nich rozróżniać kolejność i nie zagłębiać się w to w jakiej kolejności wykonują się eventy

 

 

Napisał, co wiedział, pociął i pomieszał. Sam jesteś epicki.

 

Mówiąc zwięźle i krótko:

Kolejność wykonywania kodu ustalana jest przez(kolejno): Event, Depth, ID;

Odnośnik do komentarza
Udostępnij na innych stronach

Napisał, co wiedział, pociął i pomieszał. Sam jesteś epicki.

 

Mówiąc zwięźle i krótko:

Kolejność wykonywania kodu ustalana jest przez(kolejno): Event, Depth, ID;

 

Nie do końca bo to zbyt ogólnie powiedziane. Duże znaczenie ma kolejność utworzenia obiektu w edytorze i to jest chyba najpierw brane pod uwagę oczywiście w ramach pewnych eventów (begin step, step, kolizje). Drawem rządzi depth. ID ma wpływ na samym końcu.

Odnośnik do komentarza
Udostępnij na innych stronach

Kolejność układania obiektów w room edytorze == id

Za każdym razem jak stawiasz obiekt to przydziela mu się następne id.

 

Ale kto mówi o room edytorze?! To to samo jak instance_create czyli kolejność tworzenia obiektów na roomie. Mi chodzi o zdefiniowanie (utworzenie definicji obiektu, nadanie mu nazwy) samego obiektu w edytorze GMa. I właśnie ta kolejność decyduje o kolejności o której wspominam wcześniej. Poczytajcie na spokojnie jeszcze raz od początku wszystko.

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