Strona główna
Witaj, nieznajomy!

Pętle

Pętle są niezbędne w nawet najmniejszych misjach, np. do sprawdzenia czy gracz znajduje się w określonym miejscu. Pętle były wykorzyszystywane w prawie wszystkich dotychczasowych tutorialach. Teraz postaram się to wytłumaczyć trochę dokładnie.
Pętlą nazywamy coś co jest powtarzane x razy. Jeśli ma być ona przerwana to musi być spełniony jakiś warunek lub warunki.>

Pętle


Konstrukcja naprostszej pętli wygląda nastepuąco:

Kod:
:petla
wait 
3000
 0109: player $PLAYER_CHAR money += 1000
jump 
@petla



:petla - nazwa procedury (pętli), która będzie zawierała kod naszej pętli. Nazwa może być dowolna.
wait 3000 - odczekujemy 3000 milisekund (ms), czyli 3 sekundy. Przy pętli jest to NIEZBĘDNE, jeśli nie odczekamy jakiegoś czasu to gra zawiesi się w momencie startu wykonywania pętli. Możemy odczekać dowolną ilość czasu w zależności od potrzeb. Wartości może być nawet 0.
0109: player $PLAYER_CHAR money += 1000 - normalna funkcja dodająca 1000$ na konto gracza. Wartość oczywiście można zmienić.
jump @petla - przeskakujemy do procedury "petla", czyli w tym przypadku na początek naszej pętli. Dzięki zastosowaniu tej funkcji nasz kod jest zapętlany.

Podsumowując, stworzyliśmy pętlę, ktora co 3 sekundy dodaje 1000$ na konto gracza.

Pętle sprawdzające (if)


Powyższy przykład tylko zapętla bez przerwy podany kod, a co jeśli chcemy w pewnym momencie przerwać działanie pętli? W takim wypadku należy zastosować tzw. pętle sprawdzające, które kończą swoje działanie po spełnieniu podanego warunku. Przykład:

Kod:
:petla
wait 
0
if
 
010A:   player $PLAYER_CHAR money > 1000
jf 
@petla

[dalszy kod]



:petla - to co w poprzednim przykładzie, nazwa procedury.
wait 0 - odczekujemy 0 ms. Przypominam, że jeśli ominęlibyśmy funkcję wait to gra by się zawiesiła.
if - "jeśli". Ta funkcja pozwala na sprawdzenie czy warunki, ktore po niej następują, są prawdziwe. 010A: player $PLAYER_CHAR money > 1000 - to jest tak zwana funkcja sprawdzająca, która jest warunkiem do spełnienia. W tym przypadku sprawdza czy stan konta gracza jest większy niż 1000$.
jf @petla - "jump if false". Jeśli warunek jest nieprawdziwy to następuje przeskok do podanej procedury (tu: petla).
dalszy kod - kod, który ma się wykonać w przypadku, gdy warunki zostaną spełnione.

Teraz stworzyliśmy pętlę, która sprawdza czy gracz ma więcej pieniędzy niż 1000$. Jeśli nie ma to sprawdzamy znowu, jeśli ma to wykonywany jest dalszy kod. Zauważ że funkcje if, jf, wait i jump nie mają swojego przyporządkowanego kodu. Niektórych funkcji, które są najczęściej wykorzystywane, można używać w skróconej wersji.

if = 00D6: if
jf @petla = 004D: jump_if_false @petla
jump @petla = 0002: jump @petla
wait 0 = 0001: wait 0 ms

Możesz użyć poniższej konstrukcji, jeśli chcesz sprawdzać kilka warunków na raz i obsłużyć każdego inaczej, tj. wykonać inny kod dla każdego warunku.

Kod:
:petla1
wait 
0
if
 
010A:   player $PLAYER_CHAR money > 1000
jf 
@petla2

jump 
@kod1

:petla2
wait 
0
if
 
00F2:   actor 67@ near_actor 47@ radius 20.0 20.0 0
jf 
@petla3

jump 
@kod2

:petla3
wait 
0
if
 
0119:   car 0@ wrecked
jf 
@petla1

jump 
@kod3

:kod1
instrukcje

:kod2
instrukcje

:kod3
instrukcje



Kod wyszedł trochę długi ale chciałem dokładnie pokazać jak posługiwać się tym sposobem. Wszystko jest oparte na przeskakiwaniu do innych procedur. W pierwszej pętli, jeśli warunek jest spełniony to następuje przeskok (jump) do procedury o nazwie "kod1", która jest za wszystkimi pętlami. W przypadku, gdy warunek nie jest spełniony, przeskakujemy (jf) do procedury "petla2". Tam wykonywana jest identyczna czynność, tylko następuje przeskok do "kod2" i "petla3". W ostatniej pętli zasada działania jest również taka sama, w przypadku spełnienia warunku przeskakujemy do "kod3", a jeśli warunek nie zostanie spełniony to następuje przeskok do pierwszej pętli i tak w kółko.
Jeśli nie musisz obsłużyć inaczej każdego warunku to użyj poniższych metod.

Pętle sprawdzające (if and, if or)


Powyższa metoda jest dość długa, jeśli chodzi o kod. Można to skrócić ale dla wszystkich warunków będzie taki sam kod w przypadku ich spełnienia.

Kod:
if and
:petla1
wait 
0
if 
and 010A:   player $PLAYER_CHAR money > 1000
 00F2:   actor 67@ near_actor 47@ radius 20.0 20.0 0
 0119:   car 0@ wrecked
jf 
@petla1

dalszy kod


Funkcja if z dopiskiem and sprawdza czy wszystkie podane warunki są prawdziwe. W powyższym przykładzie sprawdzamy czy gracz ma więcej niż 1000$, czy aktor 67@ jest blisko aktora 47@ oraz czy auto 0@ jest zniszczone. Jeśli wszystkie te warunki zostaną spełnione, wykonywany jest dalszy kod, jeśli warunki są nieprawdziwe to sprawdzamy ponownie przeskakując do początku pętli.

Kod:
if or
:petla1
wait 
0
if 
or 010A:   player $PLAYER_CHAR money > 1000
 00F2:   actor 67@ near_actor 47@ radius 20.0 20.0 0
 0119:   car 0@ wrecked
jf 
@petla1

dalszy kod


Funkcja if z dopiskiem or służy do sprawdzenia czy jakikolwiek podany warunek jest prawdziwy. Jeśli tak to wykonywany jest dalszy kod, jeśli nie to sprawdzamy ponownie.

Dodam jeszcze że funkcje if and i if or można zapisać trochę inaczej dodając ten przyrostek na końcu każdej funkcji sprawdzającej, np.

Kod:
if
 010A:   player $PLAYER_CHAR money > 1000 and
 
00F2:   actor 67@ near_actor 47@ radius 20.0 20.0 0 and
 
0119:   car 0@ wrecked


Jest to alternatywna metoda ale dłuższa i bardziej męcząca, szczególnie podczas wprowadzania zmian.

UWAGA: if and i if or przyjmują tylko 9 warunków.

IF..THEN..END


Oprócz zwykłej konstrukcji można zastosować tak zwaną wysoko poziomową.
if - jeśli
then - wtedy
end - koniec
Działa to na zasadzie: jeśli dany warunek jest spełniony, wtedy wykonaj dany kod, a po nim zakończ konstrukcję.

Kod:
if
 010A:   player $PLAYER_CHAR money > 1000
then 
0109: player $PLAYER_CHAR money += 2000
end


Słownie: jeśli gracz ma więcej niż 1000$ to dodajemy do jego konta 2000$ i kończymy konstrukcję.

IF..THEN..ELSE..END


To jest także konstrukcja wysoko poziomowa ale z jedną dodatkową funkcją.
else - w przeciwnym wypadku
Ta konstrukcja działa w ten sposób: jeśli dany warunek jest spełniony, wtedy wykonaj dany kod. W przeciwnym wypadku wykonaj inny kod i zakończ konstrukcję.

Kod:
if
 010A:   player $PLAYER_CHAR money > 1000
then 
0109: player $PLAYER_CHAR money += 2000
else0109: player $PLAYER_CHAR money -= 100
end


Słownie: jeśli gracz ma więcej niż 1000$ to dodajemy do jego konta 2000$, w przeciwnym wypadku odejmujemy od jego konta 100$ i kończymy konstrukcję.

Funkcje sprawdzające


Kod:
010A:   player $PLAYER_CHAR money > 1000
 00F2:   actor 67@ near_actor 47@ radius 20.0 20.0 0
 0119:   car 0@ wrecked


Powyższe funkcje zostały użyte w tym tutorialu. Łączy je jedna rzecz: są to funkcje sprawdzające, które są używane razem z if. Łatwo je rozróżnić od innych funkcji:

1. Po unikalnym kodzie następuje słowo związane z czymś co jest sprawdzane, np. actor, car, object, player.
2. Funkcje porównujące wartości mają jakiś operator, np. > , < , == , >= , <= , <>.
3. Po unikalnym kodzie zawsze następują trzy spacje.
Dodane przez: MakG
Posting comments to this article is disabled.
Created & Powered by MakG
Wszelkie prawa zastrzeżone