Ten tutorial pokaże jak używać komendy Wait w pętli Repeat, i dlaczego należy używać jej w ten sposób.
Problem z Wait polega na tym, że zatrzymuje ona wyłącznie bieżący, najbliższy strumień wydarzeń. Wait nie zatrzymuje:
- całej gry,
- pętli,
- innych, równoległych wydarzeń;
Ashley wyjaśnił to kiedyś w ten sposób: "Ludziom często wydaje się, że [Wait] zatrzymuje wszystkie pozostałe wydarzenia w grze. W rzeczywistości polecenie to nie mogłoby działać w taki sposób, ponieważ powodowałoby zawieszenie całej gry w trakcie trwania pauzy"
Wynikiem tego wszystkiego jest nieporozumienie w sytuacji, kiedy chcemy zrobić coś takiego:
"Domyślnie" może nam się wydawać, ze pozycja Sprite będzie uaktualniana co każde 0.5 sekundy. Tak się jednak nie stanie. C2 nie uruchamia pętli jedna-po-drugiej, czekając na zakończenie poprzedniej iteracji. W zasadzie Repeat trudno nazwać pętlą, ponieważ ta jest najczęściej rozumiana jako coś, co dobiega końca, i wtedy zaczyna się od nowa.
W powyższym przykładzie, wszystkie 100 zmian położenia Sprite zostanie obliczone natychmiast, a użytkownik nie zauważy żadnego ruchu.
Sposób, w jaki działa Repeat w C2 jest następujący: wydarzenia uruchamiane są X razy niezaleznie od ich zawartości, tworząc niezależne strumienie. Nie wygląda to tak:
|---loop 1---||---loop 2---||---loop 3---||---loop 4---||---loop 5---|
|---loop 1---|
|---loop 2---|
|---loop 3---|
|---loop 4---|
|---loop 5---|
Niezależnie od tego co robimy wewnątrz pętli, zostanie ona uruchomiona w ten właśnie sposób.
Tym, co chcemy osiągnąć, jest jednak poprzednia sytuacja. Na szczęście istnieje na to prosty sposób, który polega na 'ręcznym' opóźnieniu każdej iteracji.
W powyższym przykładzie chcemy aby pierwsza pętla zaczynała się na 0.5 sekundy, druga na 1 sekundzie, trzecia 1.5 itd. Musimy więc opóźnić każde uruchomienie o czas pomnożony przez loopindex, tzn. numer tego uruchomienia.
W ten sposób, pętla czeka:
0.5 s * 1 = 0.5 s
0.5 s * 2 = 1 s
0.5 * 3 = 1.5 s
etc.
A zatem:
Powinno działać zgodnie z oczekiwaniami. I działa!
CAPCX w załączniku.
UWAGA: W tym przykładzie prawdopodobnie wygodniej byłoby po prostu użyć warunku Every X seconds, istnieją jednak liczne sytuacje, w których Wait jest bardziej elastyczne.