Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs icon

Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs




Скачати 97.65 Kb.
НазваПрежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs
Дата конвертації31.03.2013
Розмір97.65 Kb.
ТипДокументи

Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты SQS, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в SQF то, что вы уже умеете делать в SQS.


На практике, люди освоившие SQF в достаточной степени, уже стремятся к большему, это уже скриптеры, а не картоделы. И пояснять такие вещи для них просто скучно. Это как для нас, опытных в SQS - пытаться объяснять новичку что такое цикл в SQS или переменные.
Видимо и нет поэтому туториалов, где подробно расписано что такое SQF и с чем его едят. А между тем, этот код нагляднее, быстрее, практичнее чем SQS, более того, он рекомендован для использования BI Studio и на практике, баги которые вылезали в SQS в SQF, мне не попадались!

Итак, поехали:

^ ОСНОВНЫЕ ПРАВИЛА


ВСЕ строки в SQF должны заканчиваться символом ;
например:

Код:

_man = _this select 0;

Скрытый текст:


Ну, на самом деле не все так просто, арма не читает скрипт построчно. Скрипт состоит из отдельных выражений (провести аналогию с предложением) которые разделяются точкой с запятой. Последняя строка скрипта может и не иметь завершающего символа. Тут скорее разграничение блоков команд, например:
if (_i==0) then {
_a=_a+1;
}
else {
_b=_b+1;
}; - только завершающие скобки блока закрываются символом }; а так же строки внутри самого блока.
Есть еще вариант последовательности команд как
if (_i==0) then {_a=_a+1}; if (_j==0) then {_b=_b+1}; - команды как и в SQS разделены ;
Однако, чтобы не забивать себе голову деталями, можно смело добавлять разделитель после каждой строки или блока команд, тем более что без него скрипт выдаст ошибку.

^ Символы @,?,~ - отсутствуют и заменяются командами

@условие - WaitUntil {условие};
?условие : - if(условие) then {};
~1 - sleep 1;

Команда exit тоже отсутствует, впрочем она и не нужна.
Всегда запускайте арму в процессе создания скриптов с параметром -ShowScriptErrors в ярлыке. Это позволит вам сразу же заметить допущенную ошибку и избавиться от перелома мозга с тягчайшими последствиями, т.к. если в SQF возникает ошибка то скрипт прекращает выполнение.
В целом, разница между SQS и SQF состоит в сложных конструкциях, в остальном же скрипт выполняется абсолютно таким же образом, сверху вниз, построчно выполняются заданные команды.


ЦИКЛЫ

Под сложными конструкциями мы понимаем прежде всего циклы.
Например, давайте рассмотрим как будет выглядеть простенький цикл с счетчиком в разных форматах.

SQS:

Код:

_i=0

#start

_i=_i+1

~1

hint format ["%1", _i]

?_i < 6: goto "start"

Данный скрипт расчитан на 6 повторов, паузу в 1 секунду в каждом повторе и сообщение с номером повтора.
Теперь посмотрим как это выглядит в SQF
SQF предоставляет нам несколько видов циклов, которыми можно провернуть данную операцию.

Способ первый
Четко заданное число повторов.

Код:

for "_i" from 0 to 5 do

{

sleep 1;

hint format ["%1", _i];

};

Примечание: Скрипт разбит на несколько строк для удобства восприятия. По сути игра воспринимает его как

Код:

for "_i" from 0 to 5 do {sleep 1;hint format ["%1", _i];};

но так он читается визуально сложнее и можно случайно ошибиться.

Впрочем, есть еще вот такой вариант:

Код:

for [{_x=1},{_x<=10},{

_x=_x+1;

sleep 1;

hint format ["%1", _x];

}] do

тут еще веселее
for [{старт},{условие финиша},{действие на такте}] - впрочем не заморачивайтесь, первого варианта вполне хватит.

Поясняю технологию процесса
по русски это выглядит как
для "_i" от 0 до 5 сделать {код};

В данном случае, _i - это встроенный счетчик повторений цикла. В каждом повторе его значение меняется на +1.
от 0 до 5 - количество повторений, вместо пятерки можно подставить любое возвращаемое значение, например

Код:

from 0 to (count (units _group))-1 do {};

^ Примечание: считается все вместе, в т.ч. и 0, поэтому если нам нужно действительное количество солдат в группе - отнимаем 1.Т.е. цикл от 0 до 5 повторится 6 раз!

Скрытый текст:

Наглядно это выглядит так

Код:

; SQS от нуля до пяти включительно (шесть раз)


_i = 0

#loop

hint str _i;

~1

_i = _i+1

? _i <= 5 : goto "loop"


// SQF от нуля до пяти включительно (шесть раз)


for "_i" from 0 to 5 do {

hint str _i;

sleep 1;

};

Способ второй

Код:

_i=0;

while {_i>=5} do {

_i=_i+1;

sleep 1;

hint format ["%1", _i];

};

выглядит по русски это
пока {значение не станет true} делать {код};
Это удобно для создания циклов с неизвестным количеством повторов до тех пор пока не произойдет некое событие в игре (а оно может и не произойти - вот вам и бесконечный цикл на всю миссию).

Способ третий

Код:

_i=0;

{

_i=_i+1;

sleep 1;

hint format ["%1", _i];

} forEach [0,0,0,0,0];

Это у нас известная команда Foreach которой пользуются многие, но далеко не все знают ее настоящие возможности.
по русски выглядит
{код} выполнить для каждого элемента массива [0,0,0,0,0];
Т.е. у нас есть массив [0,0,0,0,0] с пятью нулями (или любыми другими цифрами, не имеет значения). Код в скобках {} выполнится столько раз, сколько элементов содержится в массиве. Опять же, в качестве массива мы можем использовать любой массив. Например количество живых солдат в группе и т.п.

Скрытый текст:

Вообще-то, главное в forEach, это переменная _x, использовать forEach в качестве цикла преступно
forEach предназначен для обхода массивов, то есть, для случаев, когда над каждым элементом массива надо провести однотипные действия.
Т.е. команда

Код:

{removeallweapons _x} foreach units group player;

уберет оружие у всех солдат из группы игрока, включая оружие самого игрока. Т.е. _x в команде, это конкретный элемент предложенного массива.

Способ четвертый

Код:

_a = 0;

WaitUntil {

sleep 1;

_a = _a + 1;

_a == 5

};

выглядит по русски это
ждем пока {ждем секунду, прибавляем значение, проверяем значение, если true - то цикл завершается};
в отличии от While условие проверяется в конце, удобно если цикл должен быть выполнен хотябы один раз.

^ УСЛОВИЯ В ЦИКЛАХ

Это основные виды циклов в SQF, теперь перейдем к условиям выполнения неких действий в течении цикла.
Например в SQS это выглядит так:

Код:

_i=0

#start

_i=_i+1

~1

?_i==3: hint format ["%1", _i]

?_i < 5: goto "start"

Тут все очевидно, если в течении цикла переменная _i примет значение 3, то об этом высветится сообщение.

Рассмотрим SQF

Код:

for "_i" from 0 to 5 do

{

sleep 1;

if(_i==3) then {hint format ["%1", _i]};

};

Код:

_i=0;

while {_i>=5} do {

_i=_i+1;

if(_i==3) then {hint format ["%1", _i]};

};

Код:

_i=0;

{

_i=_i+1;

sleep 1;

if(_i==3) then {hint format ["%1", _i]};

} forEach [0,0,0,0,0];

помимо этого, конструкция
if () then {}; имеет еще и продолжение else {};
На практике, если в SQS нам приходится использовать метки чтобы выдать разные действия, то в SQF можно обойтись одной строкой

SQS

Код:

?!(alive _man) : hint "dead"; goto "end"

hint "alive!"

#end

SQF

Код:

if !(alive _man) then {hint "dead"} else {hint "alive!"};

Следовательно в циклах можно использовать это как

Код:

for "_i" from 0 to 5 do

{

sleep 1;

if(_i==3) then {hint format ["%1", _i]} else {hint "ne 3..."};

};


^ ПРИНУДИТЕЛЬНЫЙ ВЫХОД ИЗ ЦИКЛА

Едем дальше.
Как правило выход из SQS цикла означает несовпадение условия для срабатывания команды goto либо принудительное перенаправление на иную метку в процессе цикла.

Код:

_i=0

#start

_i=_i+1

~1

?_i==3: goto "end"

?_i < 5: goto "start"

#end

В SQF цикл завершается командой exitWith {};

Код:

for "_i" from 0 to 5 do

{

sleep 1;

if(_i==3) exitWith {hint format ["%1", _i]};

};

Что особенно приятно, в скобках можно написать еще и выполняемый в процессе выхода код.
Надо отметить что команда exitWith выполняется только по условию и завершает только тот блок в котором расположена. То есть, весь скрипт будет замечательно работать и дальше. Но цикл или блок команд - благополучно завершится.

Скрытый текст:

Принудительный выход exitWith производится из блока ограниченого скобками

Код:

While {true} do {

if (-) exitWith {};

};

выход сюда

для выхода из вложеного цикла следует применять "Именованый блок"
scopeName "Блок" - выдача имени
breakTo "Блок" - принудительный выход (некоторе подобие exit в sqs)

Код:

scopeName "Блок";

While {true} do {

While {true} do {

if (-) exitWith {};

if (true) then {breakTo "Блок"};

};

выход сюда по exitWith

};

выход сюда по breakTo


И раз уж мы дошли до этого, то на очереди -


^ БЛОКИ КОМАНД

(это означает что с циклами покончено)!
Итак что такое блоки команд.
Это некая последовательность команд подгруженная в память и вызванная в процессе выполнения скрипта. Они же еще называются функциями.
Для их вызова используются две команды.
spawn и call - разница между ними лишь в том, что call останавливает выполнение скрипта до момента завершения блока команд. Ну на самом деле там все маленько сложнее, но для упрощения восприятия можно считать что команда call останавливает блок команд в котором выполнена до момента завершения вызванной функции.

Как оно выглядит на практике

Код:

_fnc =

{

for "_i" from 0 to 5 do

{

sleep 1;

if(_i==3) exitWith {hint format ["%1", _i]};

};

};


некие команды-1;

[] spawn _fnc;

некие команды-2;

В итоге, функция выполнится после некие команды-1;, но не остановит выполнение скрипта и скрипт не будет дожидаться завершения функции, а продолжит выполнять некие команды-2;

Если же вместо spawn мы используем call - некие команды-2; не будут выполняться до того момента, пока не выполнится функция которую мы вызвали.

Скрытый текст:

Может создаться впечатление, что call, это медленнее, раз он "останавливает выполнение скрипта". Но на самом деле он ничего не останавливает, просто управление переходит к вызванной функции.

Иными словами, spawn - это как будто мы вызываем отдельный скрипт.

Скрытый текст:


Именно выполняем отдельный скрипт, полноценный скрипт в отдельной VM. Разница лишь в том, что текст скрипта берется не из файла, а из блока (значение с типом CODE). Или из переменной, которая содержит непосредственно код.
Следствие этого: переменные которые находятся в текущем скрипте не будут доступны в новом (в новой, созданной VM).


более того, если мы вызываем функцию командой function=[] spawn _fnc; то мы имеем возможность прекратить работу функции в любую секунду командой terminate function;

теперь о переменных в функциях.
Вызов функции - это как вызов нового скрипта.

Скрытый текст:


Важное отличие: скрипт, это последовательность команд которая запущена в отдельной VM (командами exec, execVM, spawn), а функция, просто блок команд, который вызван командой call. У новой VM свои переменные, она выполняется параллельно текущему скрипту (к отдельный процесс), функция выполняется здесь же, на месте, как продолжение текущего кода, и ей доступны локальные переменные которые существуют на данный момент (что, кстати, очень плохо, но это отдельный разговор).


То есть, мы можем передать туда глобальные переменные (или локальные) и оперировать ими в функции.
Выглядит это так

Код:

_fnc =

{

_sol = _this select 0;

команды;

};


for "_i" from 0 to (count (units _group))-1 do

{

[(units _group) select _i] spawn _fnc;

};

то же самое и для call, только цикл будет останавливаться на время выполнения функции _fnc


^ SWITCH И CASE КАК ЗАМЕНА GOTO "";


Есть в sqs такой занятный оператор как goto "";
Он заставляет скрипт перейти к какому-то определенному участку в коде.
Например:

Код:

_m= _this select 0


?_m==1: goto "first"

?_m==2: goto "second"

?_m==3: goto "third"

exit


#first

hint format ["%1",_m*10]

exit


#second

hint format ["%1",_m*20]

exit


#third

hint format ["%1",_m*30]

exit

Теперь смотрим как такой код выглядит в SQF

Код:

switch (_this select 0) do

{

case 1: {hint format ["%1",_m*10]};

case 2: {hint format ["%1",_m*20]};

case 3: {hint format ["%1",_m*30]};

};

Разбираем.


переключить на (полученное извне значение или любое иное значение) выполняем
{
если первый вариант: {делаем код};
если второй вариант: {делаем код};
если третий вариант: {делаем код};
};

Разумеется CASE может быть любое значение, не только 1,2,3...
например вот:

Код:

switch (_this select 0) do

{

case "string1": {код};

case 515: {код};

case man: {код};

};

Вместо значения в скобках switch() можно подставить true, это будет означать немедленный переход к условиям проверки вариантов, без гарантированного совпадения переменных
Допустим, следующий код без true не сработает, т.к. _a определенно не равно какому либо из вариантов.

Код:

switch (true) do

{

case _a>50: {код};

case _a<25: {код};

case _a==30: {код};

};

Есть еще одно значение default
если значение не совпадает с каким либо элементом, то выполняется этот код.

Код:

switch (_this select 0) do

{

case "string1": {код};

case 515: {код};

case man: {код};

default {код};


};


Вот в принципе и все основные моменты скриптописания в SQF.
Нет, разумеется при более углубленном изучении представляется возможность писать свой код более многомерным и более мощным, но перечисленных мною примеров вполне хватит чтобы освоить SQF в необходимой степени для создания миссий.
Ах да, чуть не забыл.
Вызываются SQF скрипты командой execVM "script.sqf";

Использованы материалы от
DenVdmj - пояснение терминологии, примеры
SlavaRum - четвертый вид цикла, расширенное описание exitwith
bakzz - пояснение использования символа ;

Автор: Wass [OTK Studio]

Источник: F.ru



Схожі:

Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconПуть к ясному сознанию. Предисловие Мое имя Бодхи. В этой книге я изложил свою «Практику Прямого Пути»
Мне кажется, что то, что я напишу здесь не впустую, что это когда-нибудь коснется чьей-то души и заденет ее непоправимо. Что кто-то...
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconКнига на сайте: Текст в авторской редакции
Что такое право? Как его можно определить? В чём его сущность? Что такое закон и когда он возникает? Есть ли разница между правом...
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconКнига на сайте: Проблема ландшафта
Вопрос о том, что такое ландшафт интересовал учёных уже давно. По этому поводу неоднократно высказывались разные мнения, а что касается...
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconОлимпиады по информатике
Во вторых, на олимпиаде важно не просто решить задачу как-нибудь, а найти эффективное решение. Мы не будем здесь разъяснять, что...
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconХотела бы добавить по поводу Ковальчук Валентины Николаевны, которая уже есть в вашем списке. Присоединяюсь ко всему что о ней написано и хочу добавить, что она очень нечистоплотна и в плане личной гигиены и в быту
Совершенно бесцеремонная — могла взять запросто мою косметику, а шариковый дезодорант я просто выбросила так как он вонял конским...
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconTime-management. Сказка о непотерянном времени
Вы думаете, что без вечной спешки и цейтнота сегодня не прожить? Французский психолог Катрин Леже считает, что в таком случае вы...
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconЗдравствуй, грусть Франсуаза Саган
Это такое всепоглощающее, такое эгоистическое чувство, что я почти стыжусь его, а грусть всегда внушала мне уважение. Прежде я никогда...
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconDialogue: 0,0: 06: 56. 98,0: 06: 58. 53,muminki sub,,0000,0000,0000,,Не может быть! Малышка Мю
Это я должна удивится и что ты здесь делаешь Муми-тролль? [Это я должна удивляться. Что ты здесь делаешь?]
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconDialogue: 0,0: 06: 56. 98,0: 06: 58. 53,muminki sub,,0000,0000,0000,,Не может быть! Малышка Мю
Это я должна удивится и что ты здесь делаешь Муми-тролль? [Это я должна удивляться. Что ты здесь делаешь?]
Прежде чем читать данную статью, убедитесь что вы знаете что такое скрипты sqs, переменные, циклы. Здесь не будет объяснения данных понятий, здесь мы просто рассмотрим как сделать в sqf то, что вы уже умеете делать в sqs iconКнига для героев 1991
Подобно тому, как она изменила мою. Большинство мыслей, которые вы здесь найдете, принадлежат мне. Это как раз то новое, которое...
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©te.zavantag.com 2000-2017
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи