Opóźnianie pętli za pomocą Wait

1
  • 0 favourites

Tagged

Attached Files

The following files have been attached to this tutorial:

.capx

wait-in-loops.capx

Download now 172.21 KB

Stats

2,234 visits, 2,365 views

Tools

Translations

License

This tutorial is licensed under CC BY 4.0. Please refer to the license text if you wish to reuse, share or remix the content contained within this tutorial.

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

Ale raczej tak:

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

.CAPX

wait-in-loops.capx

Download now 172.21 KB
  • 0 Comments

  • Order by
Want to leave a comment? Login or Register an account!