TO_mek Opublikowano 5 Marca 2015 Udostępnij Opublikowano 5 Marca 2015 Witam! Jak prawidłowo powinna wyglądać obsługa kilku zdarzeń asynchronicznych. W moim projekcie mam na razie 2 typu dialog i już o jeden za dużo bo są konflikty. Pierwszy asynchron to: msg:=show_question_async('Quit?'); po wciśnięciu klawisza Backspace z obiektu w którym zdefiniowane jest zdarzenie dialog, drugi to: msg:=get_string_async("You get the best position in the High Score table! Enter the name. ","Retrospect Workshop"); pytanie o imię gracza w celu zapisu go do HS, wywoływane z innego obiektu. W evencie Dialog pierwszego obiektu mam: GML //blok obsługujący Backspace var i_d, stat; //Backspace dla wyscia z gry i_d = ds_map_find_value(async_load, "id"); if i_d == msg{ if ds_map_find_value(async_load, "status"){ game_end(); } } //blok obsługujący zapytanie o Imię do HS var i_d = ds_map_find_value(async_load, "id"); if i_d == msg { if ds_map_find_value(async_load, "status") { if ds_map_find_value(async_load, "result") != "" { drawer_obj._imie = ds_map_find_value(async_load, "result"); } } } Po pierwsze mimo, że drugie pytanie (o imię do HS) wywołuję z innego obiektu to i tak obsługuje go zdarzenie z pierwszego obiektu. Po drugie zarówno pierwszy jak i drugi próbuje obsłużyć cały kod - co wydaje się logiczne bo prawie niczym się nie różnią oba bloki i niby jak ma być to rozróżnione. Szukałem w dokumentacji ale tam nie znalazłem przykładów na kilka zdarzeń asynchronicznych a pewnie jest to banalne. Kolejna sprawa to samo działanie asynchroniczne. Wiem, że zadanie pytania o imię do HS nie zatrzymuje gry i wynika to m.in. przez to, że pytanie tradycyjne get_string zawiesza grę podczas gdy telefon traci fokus ale w poniższym pseudokodzie działanie asynchroniczne jest bez sensu i powoduje zawsze zapisanie gracza jako "Anonim". GML msg:=get_string_async("You get the best position in the High Score table! Enter the name. ","Retrospect Workshop"); _imie:=msg; //miejsce na petle ktora czeka na rezultat if string_length(_imie) < 1 then _imie:="Anonim"; ds_grid_set(global.hs,0,0,_imie);//i wpisz na 1 miejsce imie Gracza ds_grid_set(global.hs,0,1,score);// i jego punkty</span></span> Czyli i tak należy wykonywać jedną z pętli dopóki msg nie będzie miał asynchronicznie nadanej wartości? Ale czy to nie zawiesi gry w momencie utraty fokusa? EDIT: Brakowało w CREATE obu obiektów zadeklarowania zmiennych msg=-1; Dodatkowo zmienłlem nazwę zmiennej w drugim bloku GML //blok obsługujący zapytanie o Imię do HS var i_dd = ds_map_find_value(async_load, "id"); if i_dd == msg Pozostaje problem z zatrzymaniem wykonywania skryptu zapisującego HS do momentu, gdy użytkownik zdąży wpisać swoje imię. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 6 Marca 2015 Administratorzy Udostępnij Opublikowano 6 Marca 2015 Pozostaje problem z zatrzymaniem wykonywania skryptu zapisującego HS do momentu, gdy użytkownik zdąży wpisać swoje imię. Przenieś cały kod poniżej "msg:=get_string_async..." do eventu dialog, zamiast "drawer_obj._imie = ..." :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę