Rychlé přerušení cyklu
Většina skriptovacích jazyků má možnost dříve ukončit prováděný cyklus. Arma engine je na tom stejně.
Dejme tomu, že máte skript, který prochází dlouhý seznam a hledá
v něm první objekt splňující podmínku. Než zbytečně procházet celý
cyklus, je možné jej ukončit dříve k čemuž nám pomohou příkazy
scopeName a breakOut.
Mrkněme na příklad, kde mají některé jednotky
celo_fnc_set_next_guard = {
_back = false;
{
scopeName "hunter_cycle";
if ((side _x == opfor) and !(_x getVariable ["hunter",false])) then
{
//cokoliv co chci delat s promennou
_x setVariable ["hunter",true,true];
_x doMove getpos player;
_back = true;
//a na konci ukoncim cyklus
breakOut "hunter_cycle";
};
} forEach allUnits;
_back;
};
Příklad je jen ilustrační a není optimální. Dejme tomu, že si
vytvoříte spínač, který opakovaně každou minutu volá tuto funkci (dokud
ji vrací true). Takže výsledek bude takový, že každou minutu projde funkce
všechny jednotky ve hře a pokud najde první, která je součástí opfor jednotek a nemá nastavenou proměnnou „hunter“, pak ji nastaví a jednotku pošle na aktuální pozici hráče a oznámí funkci, že má vrátit true.
Princip je v tom, že ve forEach cyklus jsem příkazem scopeName si vytvořil scope neboli „rámec působnosti“ a pojmenoval ho „hunter_cycle“ a pak při nalezení hledaného objektu jsem příkazem breakOut oznámil, že jej chci opustit. Systém tak nebude procházet všechny jednotky i po nalezení, ale dojde k pokračování funkce a následně jejím ukončení.
Obdobně můžete pracovat s breakTo, který použijete ve více vnořených rámcích působnosti, kdy budete chtít třeba vyskočit rovnou o několik rámců výše (viz. příklad na BI Wiki)