Skocz do zawartości

Asynchroniczne wczytywanie danych


TO_mek

Rekomendowane odpowiedzi

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

  • Administratorzy
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

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