SQF, czyli skrypty troche lepiej

Moderator: Inkwizytor

ODPOWIEDZ
Awatar użytkownika
kondor
Posty: 1522
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

SQF, czyli skrypty troche lepiej

Post autor: kondor »

Wraz z ktoras wersja ofp weszla skladnia sqf, uzywana do pisania funkcji. Bardzo przydatna rzecz, ale chyba za malo znana u nas. Ta sama skladnia stala sie skladnia skryptow w armie. Skladnia sqs pozostala, ale jako niezalecana.
Nowa skladnia zblizona jest bardziej do jezykow programowania wysokiego poziomu za pomoca konstrukcji sterujących t.j. petle, "if-y" zamiast instrukcji skoków "goto".
Skrypty sqf zanim sie wykona nalezy skompilowac. Najprostszym sposobem jest instrukcja:

Kod: Zaznacz cały

wsk = [arg1,arg2,...]execVM "skrypt.sqf"
, ktory od razu takze wykona skrypt. Oprocz tego sposobu istnieją instrukcje samej kompilacji, wykonania skompilowanego kodu i inne. (jesli w edytorze w polu "przy aktywacji" chcemy wywolac skrypt MUSIMY go pod cos podstawic, czyli wsk=[]execVM "s.sqf")
Zasady tworzenia skryptow:
-blokiem nazywamy kod zgupowany w parę nawiasów: {.}
-kazdą instrukcję kończymy średnikiem (blok tez jest instrukcją)
-komentarze tworzymy jak w C, czyli /*komentarz wielolinijkowy*/ lub //komentarz do konca linii lub poleceniem

Kod: Zaznacz cały

comment "komentarz";
konstrukcja if wyglada tak:

Kod: Zaznacz cały

if(warunek)then{
 instrukcje;
};
lub:

Kod: Zaznacz cały

if(warunek)then{
 instrukcja1;
 ...
}else{
 instrukcjaN;
 ...
};
mozliwe jest takze wykorzystanie "if-a" do podstawienia, np:

Kod: Zaznacz cały

_min = if(a<b)then{a}else{b};
konstrukcja switch (zamiast wielokrotnego if-a):

Kod: Zaznacz cały

switch(zmienna){
 case wartosc1:{instrukcje1;}
 ...
 case wartoscN:{instrukcjeN;}
};
petla while, ktora robi cos dopot warunek jest spelniony (petla ta "kreci" sie co najwyzej 10000 razy!)

Kod: Zaznacz cały

while{warunek}do{
 instrukcje;
};
petla for (przydatna, gdy chcemy cos robic okreslona liczbe razy):

Kod: Zaznacz cały

for[{ustawienie poczatkowe}, {warunek krecenia sie petli}, {instrukcje po skonczeniu obrotu}]do{
 instrukcje;
};
czyli np:

Kod: Zaznacz cały

for[{_i=0}, {_i<liczba_graczy}, {_i=_i+1}]do{
 _jednostka = wektor_graczy select _i;
 _jednostka addRating -10000;
};
Nalezy dodac, ze zostaly wprowadzone zmienne automatyczne, ktore, gdy sa utworzone w bloku, giną poza nim. Czyli np:

Kod: Zaznacz cały

if(alive player)then{
 _text = "zyje";
}else{
 _text = "nie zyje";
}
hint _text;
wyswietli jakies scalar cos tam blabla 000ff gdyz zmienna tekst utworzona w blokach ifa poza nim zginela i zostala stworzona na nowo w linijce z hint. Aby tego bledu uniknac nalezy po prostu przed if-em napisac np

Kod: Zaznacz cały

_text = "";
Zamiast instruckji

Kod: Zaznacz cały

~ czas
jest teraz:

Kod: Zaznacz cały

sleep czas;
a zamiast

Kod: Zaznacz cały

@czas
mamy:

Kod: Zaznacz cały

WaitUntil {czas};
Podczas kompilacji na pewno trudno uniknąc bledow. Wowczas kompilator wyrzuca komunikat bledow na ekranie, a takze do pliku: document...\nazwa uzytkownika\ustawienia lokalne\dane aplikacji\arma\arma.rpt
W tym pliku sa takze wszelkie inne logi glownie z bledow podczas uruchamiania army (pewnie jego wielkosc mozecie juz liczyc w megabajtach) (ten plik mozna smialo czyscic)

linki:
http://community.bistudio.com/wiki/Control_Structures
http://community.bistudio.com/wiki/Statement
http://community.bistudio.com/wiki/Expression

tekst powstal na podstawie powyzszych linkow i moich przejsc

Mam nadzieje, ze powyzszy tekst sie komus przyda, choc pewnie nie uniknąłem bledow

[dodano]
skrypty sqf ponadto mają możliwość (wydajnego) wielokrotnego użycia, tzn:
żeby wykonać skrypt sqf należy go uprzednio skompilować* (- komenda execVM robi to automatycznie i nie trzeba się o to martwić). Kompilacja to względnie długi process. Dlatego warto raz skompilować a później wielokrotnie wykonywać skompilowany kod

Kod: Zaznacz cały

wskaznik_na_skrypt = compile preprocessFile "skrypt.sqf"
wowczas w zmiennej wskaznik_na_skrypt mamy juz zoptymalizowany kod skryptu.
Mozemy taki skompilowany skrypt wywołać w dwojaki sposób:

Kod: Zaznacz cały

[parametry] spawn wskaznik_na_skrypt
lub

Kod: Zaznacz cały

[parametry] call wskaznik_na_skrypt
Różnica polega na tym, iż ten pierwszy stworzy równoległy wątek dla skryptu.
Ponadto skrypt wywoływany poprzez call nie może zawierać instrukcji sleep oraz waitUntil, w każdym innym przypadku zaleca się używać call.

*kompilacja - w skrócie: proces zamienienia postaci zrozumiałej dla człowieka na szybką postać - lepszą dla komputera
ODPOWIEDZ

Wróć do „Edytor - tworzenie misji, skrypty oraz programowanie”