|
Форум РЕДАКТОР - ArmA 2 Основное Управляющие конструкции |
Управляющие конструкции |
› Понедельник
› 29.08.2011
› 18:11
› Сообщение #
Управляющие конструкции Управляющие конструкции - это структуры , которые используются для управления выполнением потока в скриптах. Они представляют собой последовательность кода скриптов, который помогает управлять сложными процедурами. Вы можете использовать управляющие конструкции для определения кода, который выполняется только при определенных условиях или повторяются несколько раз. Примечание для продвинутых читателей: в ОФП / ArmA / VBS скриптовый язык контролировался конструкциями обычными скриптовыми командами, без специальной обработки по сравнению с другими командами. Это отличается от большинства императивного программирования языков (например, C), где операторы структур реализуются в грамматике языка ядра."Управляющими", они стали в ходе реализации путем принятия кода в качестве аргумента. Сложные структуры управления, как " while ... do ...реализованы с использованием вспомогательных типов, например при помощи типа While. Требования: Для полного понимания этой статьи вы должны прочитать следующие статьи: • ArmA: Введение в скрипты • Переменные • Операторы Структуры условия: Условные структуры помогают определить код, который выполняется только при определенных обстоятельствах. Часто вы будете писать код, который зависит от условий игры, от другого кода или иных условий. if-Структура if-Структура определяет код, который выполняется только при выполнении определенного условия. Синтаксис выглядит так: УСЛОВИЕ - это значение или переменная которая может быть истиной или ложью. Код вложен в следующий блок выполняется только если условие истинно, иначе игнорирует утверждение УТВЕРЖДЕНИЕ - обычно последовательность операторов. Это могут быть и команды, задания, управляющие конструкции и т.д. Пример: В этом примере, проверяется первое значение _temperature: Если значение 0 или выше, чем 0, вставленный код игнорируется. Если же значение меньше 0, выполняется команда hint "Покажи!"; . Вспомогательный код (else) Вы так же можете использовать вспомогательный код, в том случае если условие не истинно. Вот вам и вторая последовательность операторов , которая выполняется, когда условие ложно. Условные задания If...then структуры могут быть применяться для назначения условного значения переменных: _living = if (alive player) then {true} else {false}; SQS синтаксис (не рекомендуется) В синтаксисе SQS использование goto команды - один из способов выполнить более одного оператора в пределах, if ... then структурах. if (УСЛОВИЕ) then {goto "label"} ... некоторые другие утверждения #label statement1 statement2 statement3 Пример 1: (без else) if (_temperature < 0) then {goto "Snow"} ... some other statements #Snow hint "Snow!" echo "There is snow!" variable = text "Hey. Snow outside." Пример 2: (with else) if (_temperature < 0) then {goto "Snow"} else {goto "Sunshine"} ... some other statements Goto "Continue" #Snow hint "Snow!" echo "There is snow!" variable = text "Hey. Snow outside." Goto "Continue" #Sunshine hint "No Snow but sunshine!" echo "There is no snow!" variable = text "Hey. No snow outside." Goto "Continue" #Continue ... Вставка if-Структуры Пример: switch- Структура (Только в Armed Assault и VBS2) В некоторых случаях вы можете проверить переменную для нескольких значений и выполнение другого кода в зависимости от значения. С вышеуказанными знаниями вы можете просто написать последовательность if-структуры. i Чем больше значений, вы хотите сравнить, тем больше получается эта последовательность. Именно поэтому была введена упрощенная switch-структура The switch структура сравнивает переменную с различными значениями: switch (ПЕРЕМЕННАЯ) do { case VALUE1: { УТВЕРЖДЕНИЕ; ... }; case VALUE2: { УТВЕРЖДЕНИЕ; ... }; ... }; Структура сравнивает ПЕРЕМЕННУЮ с другими значениями (VALUE1, VALUE2, ...). Если любое из значений подходит, соответствующий блок структур выполняется. Пример: default-Блок В некоторых случаях вы можете определить альтернативный код, который выполняется, когда ни одно из значений не подходит. Вы можете написать этот код в режиме по умолчанию в-Block. Обратите внимание, что нет двоеточия после тега default! Присваивание переменных Switch может использоваться для присваивания различных значений переменной: _color=switch (side player) do {case west: {"ColorGreen"}; case east: {"ColorRed"}; }; Циклы Циклы используются для выполнения того же блока кода для специфического или неспецифического числа раз. while-Цикл Данный цикл повторяет один и тот же блок так долго, пока данное значение условия -истинно while {УСЛОВИЕ} do { УТВЕРЖДЕНИЕ; ... }; Обратите внимание на фигурные скобки для условия. Процесс цикла означает следующее: УСЛОВИЕ вычисляется. Если условие истинно -идет дальше ко 2 ., еще пропускает блок и продолжает код в следующем цикле После выполнения всех представленных утверждений , возвращается к 1. Если УСЛОВИЕ ложно с самого начала , утверждение внутри блока данного цикла, никогда не выполнится. Потому что при тестировании while - выражение имеет место перед каждым выполнением цикла, в то время как цикл выполняется ноль или более раз. Это отличает от цикла, который выполняется один или несколько раз. Пример: _counter = 0; while {_counter < 10} do { _counter = _counter + 1; }; for-ЦИКЛ (не доступно в in OFP) For цикл повторяет блок определенной количество раз. for [{НАЧАЛО}, {УСЛОВИЕ}, {ШАГ}] do { УТВЕРЖДЕНИЕ; ... }; BEGIN - это число выполненных утверждений до того момента как начнется цикл CONDITION - это значение, которое вычисляется в каждом цикле STEP - это число утверждения выполненных после окончания цикла. Процесс цикла, выглядит следующим образом: НАЧАЛО выполнен УСЛОВИЕ вычисляется. Если истина, то переходит к 3., еще пропускает блок и продолжает код в следующем цикле Утверждения кода блока выполнено ШАГ выполнен, переходит к 2. Если УСЛОВИЕ ложно с самого начала , утверждение внутри блока данного цикла, никогда не выполнится. Пример: // цикл повторяется 10 раз for [{_i=0}, {_i<10}, {_i=_i+1}] do { player globalChat format["%1",_i]; }; will display 0 1 2 3 4 5 6 7 8 9 Описание: Переменная _i имеет значение 0 Условие _i<10 вычисляется, которое истинно до _i превышения 9. Код player globalChat _i; выполнен Переменная _i увеличивается на 1, переходит к шагу 2. for-from-to-Цикл Это уже выходит за рамки вспомогательного for цикла, что упрощает последний пример немного. for "ИМЯПЕРЕМЕННОЙ" from НАЧАЛЬНОЕЗНАЧЕНИЕ to КОНЕЧНОЕЗНАЧЕНИЕ do { Утверждение; ... }; ИМЯПЕРЕМЕННОЙ - это любое имя данной переменной используемое в цикле НАЧАЛЬНОЕЗНАЧЕНИЕ - это числовое значение которое дается до начала цикла КОНЕЧНОЕЗНАЧЕНИЕ -это числовое значение, до которого счетчик увеличивается / уменьшается Процесс цикла, выглядит следующим образом: Переменная с именем ИМЯПЕРЕМЕННОЙ инициализирует НАЧАЛЬНОЕЗНАЧЕНИЕ Если ИМЯПЕРЕМЕННОЙ не равно КОНЕЧНОЕЗНАЧЕНИЕ, код блока выполняется Если КОНЕЧНОЕЗНАЧЕНИЕ выше, чем НАЧАЛЬНОЕЗНАЧЕНИЕ, переменная увеличивается на 1 Если КОНЕЧНОЕЗНАЧЕНИЕ меньше, чем НАЧАЛЬНОЕЗНАЧЕНИЕ, переменная ИМЯПЕРЕМЕННОЙ уменьшается на 1 Переходим к шагу 2 Следующий пример семантически равен предыдущему. Пример: // цикл повторяется 10 раз for "_i" from 0 to 9 do { player globalChat format["%1",_i]; }; Описание: _i равно 0 player globalChat 0 выполнено _i уведичивается на 1 => _i сейчас 1 Возвращаемся к шагу 2 for-from-to-Цикл с пользовательским шагом По молчанию шаг прибавления переменной в на for-from-to цикле равен 1. Вы можете задать собственные шаги , используя следующий синтаксис: for "ИМЯПЕРЕМЕННОЙ" from НАЧАЛЬНОЕЗНАЧЕНИЕ to КОНЕЧНОЕЗНАЧЕНИЕ do { Утверждение; ... }; ШАГ это число, которое определяет шаг за которой переменная увеличивает каждый цикл Пример: // цикл повторяется 10 раз for "_i" from 0 to 9 step 2 do { player globalChat format["%1",_i]; }; Описание: _i iимеет значение 0 player globalChat 0 выполнена _i увеличивается на 2 => _i сейчас 2 Возвращаемся к 2 forEach-Цикл Вы будете часто использовать for цикл для увеличения массивов. _array = [unit1, unit2, unit3]; for [{_i=0}, {_i < count _array}, {_i=_i+1}] do { (_array select _i) setDamage 1; }; forEach-цикл делает именно это: он повторяет тот же блок кода для каждого элемента в массиве. { утверждение; ... } forEach ARRAY; Блок кода выполняется точное (count -МАССИВ) раз Вы можете воспользоваться волшебной переменной _x в блоке кода, которая всегда ссылается на текущий элемент массива. Пример: _array = [unit1, unit2, unit3]; { _x setDamage 1; } forEach _array; Описание: В первом цикле, утверждение unit1 setDamage 1; выполнено Во втором цикле, утверждение unit2 setDamage 1; выполнено В третьем цикле утверждение unit3 setDamage 1; выполнено Примечание: Каждая итерация (даже, когда она состоит из множественных команд) будет выполнена в течение одного кадра, так что надо знать о больших и / или сложных блоках кода! Возвратное значение Управляющие конструкции всегда возвращают последнее выражение вычисленое в пределах структуры. Пример: if (Моеусловие) then {моеЗНАЧЕНИЕA} else {моеЗНАЧЕНИЕB}; =>возвращает к моеЗНАЧЕНИЕA или моеЗНАЧЕНИЕB case Игра: Armed Assault Версия: 1.00 Описание: Смотреть switch do Синтаксис: case b Параметры: b: Что угодно Возвратное значение: Switch Type catch Игра: Armed Assault Версия: 1.00 Описание: Код процедур, когда исключение попадает в блок try.Исключение можно найти в переменной _исключение. Синтаксис: try-block catch code Параметры: try-Тип блока исключения. code - код Возвратное значение: Что-угодно do Игра: Operation Flashpoint: Resistance Версия: 1.85 Описание: Повторяет код пока условие истино. Синтаксис: while do code Параметры: while: тип While code: Код Возвратное значение: Ничего Пример: while {a>b} do {a=a+1} Примечание (Применяется в 1.85-1.97): Максимальное количество повторов цикла 10000 Если же условие продолжает оставаться истинным после 10000 повторов цикла, то цикл прерывается и выдается сообщение об ошибке. Более практический пример: Лечение юнитов до такого показателя здоровья, что они смогут самостоятельно встать: {while {not canStand _x} do {_x setDammage (getDammage _x) - 0.01}} forEach units group unitname for do Игра: Armed Assault Версия: 1.00 Описание: Заканчивает команду и запускает цикл Синтаксис: forCommand do code Параметры: forCommand: тип For code: Код Возвратное значение: Anything Пример: for "_x" from 20 to 10 step -2 do {..code..} from Игра: Armed Assault Версия: 1.00 Описание: Продолжает последовательность для переменной команды. Синтаксис: for "_var" from b Параметры: for "_var": For Type b: Число Возвратное значение: тип For Пример: for "_x" from 10 to 20 do {..code..} if Игра:Operation Flashpoint: Resistance Версия: 1.85 Описание: Обычно if, then, else конструкции доступны во многих языках. Этот синтаксис, однако, имеет альтернативные формы в виде массива. if (условие) then {код} else { код } if (условие) then [ { код },{ код } ] Результат выполняемого кода ,возвращается в качестве результата этой команды (которая может иметь значение - ничего}. Синтаксис: Anything = if (условие) then { код } else { код } Anything = if (условие) [ {Then код } , {Else код } ] Параметры: condition: выражение Boolean, determining if the code should be executed or not (when not, another code may be executed) Возвратное значение: Тип If - Утверждение, которое будет выполнять первый или второй вариант, когда используется. Это утверждение используется в then или exitWith командах. Примеры: _retVal = if (1 > 0) then {"It's true"} else {"It's false"}; hint str _retVal Если условие равно нулю, то ни "then", ни "else" выражения не будут выполнены, но при этом не появится сообщение об ошибке. Пример кода: hint "script started"; //выполняет if (nil) then { hint "true"; // никогда не выполнит } else { hint "false"; // никогда не выполнит }; sleep 3; hint "script ended"; //выполняет Тестировалась на Ванильной Arma2 1.05. Стандартный синтаксис: = if a then b Соединение синтаксиса(несколько действий) "if a then x, y, z" или "if a then x; y; z" switch Игра: Armed Assault Версия: 1.00 Описание: Смотреть switch do Синтаксис: switch exp Параметры: exp: Что угодно Возвратное значение: тип Switch Пример 1: switch (_a) do {case 1: {block}; case 2 : {block}; default {block};} Пример 2: _color = switch (side player) do { case west: {"ColorGreen"}; case east: {"ColorRed"}; }; Пример 3: _fn_moveForward = { /*...code...*/ }; _fn_moveBackward = { /*...code...*/ }; _fn_invalidKey = { /*...code...*/ }; switch true do { case (_dikCode in actionKeys "MoveForward") : _fn_moveForward; case (_dikCode in actionKeys "MoveBackward") : _fn_moveBackward; default _fn_invalidKey; }; switch do Игра: Armed Assault Версия: 1.00 Описание: Форма Switch. Синтаксис: switch do block Параметры: switch: Тип Switch block: Код Возвратное значение: Ничего Пример 1: switch (_condition) do { case 1: {hint "1"}; case 2: {hint "2"}; default {hint "default"}; }; Пример 2: switch (_condition) do { case true: {hint "true"}; case false: {hint "false"}; default {hint "default"}; }; Пример 3: switch (_condition) do { case "string1": {hint "string1"}; case "string2": {hint "string2"}; default {hint "default"}; }; then Игра: Operation Flashpoint: Resistance Версия: 1.85 Описание: Первый или второй элемент массива выполняется в зависимости от результата, if условия. Результат выполнения выражения возвращается в качестве результата (результат может быть НИЧЕГО). Синтаксис: if then else Параметры: if: Тип If else: Массив Возвратное значение: Ничего Пример 1: if (a>b) then {c=1} else {c=2} Пример 2: if (a>b) then {c=1;c=2} throw Игра: Armed Assault Версия: 1.00 Описание: Выдает исключение. Исключение обрабатывается первым взятым блоком. Синтаксис: throw expression Параметры: expression: Что-угодно Возвратное значение: Ничего Пример 1: throw "invalid argument" to Игра: Armed Assault Версия: 1.00 Описание: Продолжает последовательность 'for' команды. Синтаксис: for "_var" from a to b Параметры: for "_var" from a: For тип b: Число Возвратное значение: For тип Пример 1: for "_x" from 10 to 20 do {..код..} try Игра: Armed Assault Версия: 1.00 Описание: Определяет конструкцию try-catch. Данная конструкция создает блок обработки исключений. Любой выброшенное исключение из блока try попадает в блок Catch.Структурированное исключение блока имеет следующий вид: try //начинает try-catch блок { //блок, который может выкинуть исключение } catch { // блок, который обрабатывает исключения. Исключение описано в переменной _исключение }; Синтаксис: try code Параметры: code: Код Возвратное значение: Exception тип while Игра:Operation Flashpoint: Resistance Версия:1.85 Описание: Повторяет код пока условие истинно. Синтаксис: while condition Параметры: condition: Код Возвратное значение: While тип Пример 1: while "a>b" do {a=a+1} Пример 2: Практический пример: Лечит всех членов группы до такого уровня, чтобы они могли встать: { while {(not canStand _x) and (alive _x)} do { _x setDammage (getDammage _x) - 0.01; }; } forEach units group unitname; Примечание: Логический код, который используется для оценки в то время как условие может предшествовать коду, выполняющего регулярные команды. пример: while {_a=_a+1; _a<10} do {...} Взято с http://community.bistudio.com/wiki/Category:ArmA:_Control_Structures и переведено Mikezar Более подробную информацию о переводах вы сможете найти в официальной группе 2SFH "ВКонтакте" Сообщение отредактировал Mikezar - Понедельник, 29.08.2011, 18:14
|
› Понедельник
› 09.01.2012
› 15:49
› Сообщение #
_var1 = _this select 0;
_var2 = _this select 1; if (_var1 == "Arma") then { _var3 = getmarkerpos "markerPos"; switch (_var2) do { case 0: { _var2 = "UAZ_AGS30_INS"; _vehicle = _var2 createVehicle _var3}; }; }; // ----- ругается сюда Не могу понять почему в этом коде выдаёт ашибку Error #}; missing { Помогите разобратся пожалуйсто Пока изменил конструкцию без switcha - работает. Вопрос: а можно вообще использовать одну конструкцию внутри другой конструкции? Сообщение отредактировал ZoRRo - Понедельник, 09.01.2012, 16:51
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
| |||
| |||
Чат сайта |