Strona główna
Witaj, nieznajomy!

Instrukcje jump i gosub

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



Instrukcja "jump"

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.

Instrukcja gosub

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.



Praktyczne zastosowanie

Polecenia jump i gosub są bardzo ważnymi elementami skryptów SCM, dlatego warto wiedzieć, jak mądrze z nich korzystać.




  1. Szablon misji - użycie instrukcji gosub do stworzenia wygodnego szablonu misji.
  2. 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:
  3. 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

Dodane przez: MakG
Posting comments to this article is disabled.
Created & Powered by MakG
Wszelkie prawa zastrzeżone
Polityka prywatności