Ze względu na to, że wiele osób wydaje się mieć problemy z rozróżnieniem instrukcji jump i gosub, postanowiłem napisać ten krótki poradnik, który wyjaśni tę kwestię raz na zawsze :)
Polecenie jump, jak sama nazwa wskazuje, przeskakuje nam do podanej procedury i nie wraca do poprzedniej pozycji. Przykład:
Kod:
:START
:pierwszy_aktor
009A: 1@ = create_actor_pedtype 12 model 124 at 1565.7106 -1556.6824 13.5469
jump @trzeci_aktor
:drugi_aktor
009A: 2@ = create_actor_pedtype 12 model 125 at 1563.7106 -1556.6824 13.5469
:trzeci_aktor
009A: 3@ = create_actor_pedtype 12 model 126 at 1561.7106 -1556.6824 13.5469
Skrypt wykona tylko procedury
pierwszy_aktor i
trzeci_aktor. Po sekcji
pierwszy_aktor przeskakujemy do procedury
trzeci_aktor, dlatego kod procedury
drugi_aktor nie jest wykonywany.
Sprawa wygląda inaczej w przypadku polecenia gosub. Ono, podobnie jak instrukcja jump, przeskakuje do podanej procedury, ale wraca do miejsca, gdzie została wywołana po napotkaniu instrukcji return. Przykład:
Kod:
:START
:pierwszy_aktor
009A: 1@ = create_actor_pedtype 12 model 124 at 1565.7106 -1556.6824 13.5469
gosub @trzeci_aktor
:drugi_aktor
009A: 2@ = create_actor_pedtype 12 model 125 at 1563.7106 -1556.6824 13.5469
jump @KONIEC
:trzeci_aktor
009A: 3@ = create_actor_pedtype 12 model 126 at 1561.7106 -1556.6824 13.5469
return
:KONIEC
W tym przypadku, wszystkie procedury zostaną wykonane w następującej kolejności: pierwszy_aktor, trzeci_aktor, drugi_aktor. Dlaczego? Po sekcji pierwszy_aktor odwołujemy się do procedury trzeci_aktor i wracamy, przy użyciu return, do miejsca, gdzie użyliśmy polecenia gosub.
Polecenia jump i gosub są bardzo ważnymi elementami skryptów SCM, dlatego warto wiedzieć, jak mądrze z nich korzystać.
- Szablon misji - użycie instrukcji gosub do stworzenia wygodnego szablonu misji.
- Funkcje sprawdzające - możemy zaoszczędzić sporo czasu i kodu tworząc sobie pomocne procedury, których działanie wykorzystujemy w wielu miejscach naszego skryptu. Przykład:
Kod:
:SKRYPT
01B4: set_player
$PLAYER_CHAR can_move 0
fade 0 1500
gosub @Fading
01B2: give_actor
25@ weapon 31 ammo 300
01B9: set_actor
25@ armed_weapon_to 31
fade 1 1500
gosub @Fading
01B4: set_player
$PLAYER_CHAR can_move 1
:KONIEC
:Fading
wait 0
if
816B: not fading
jf @Fading
return
Powyższy skrypt zawiera procedurę Fading, która sprawdza, czy ekran się całkowicie ściemnił/rozjaśnił. Warto zastosować taką pętle, zamiast instrukcji wait, gdyż wtedy mamy pewność, że dalszy kod się nie wykona przed zakończeniem ściemniania/rozjaśniania ekranu. Na komputerze mogą pojawić się opóźnienia, które sprawią, że czas czekania instrukcji wait się wydłuży.
Takie samo działanie można zastosować do każdej innej sytuacji, np. sprawdzenia, czy kamera wciąż się porusza:
Kod:
0936: set_camera 1568.9657 -1589.6218 12.6 position_to 1565.6097 -1589.4849 13.4 time 5000 drop_mode 1
gosub @CameraManipulated
:CameraManipulated
wait 0
if
0933: camera_position_manipulated
jf @CameraManipulated
Posting comments to this article is disabled.