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.>
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.
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
w
ait 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.
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.
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ę.
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
else
0109: 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ę.
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.
Posting comments to this article is disabled.