Форум портала о WarCraft Форум портала о WarCraft
порно чат

Вернуться   Форум портала о WarCraft > Вселенная WarCraft > World Editor > Статьи
Регистрация Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Ответ
 
Опции темы Опции просмотра
Старый 24.07.2010, 22:39   #1
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию Синтаксис JASS.

Синтаксис JASS.

Теперь я расскажу о синтаксисе языка Jazz - сразу предупреждаю, что опишу далеко не все ключевые слова (слова, используемы только в библиотеках вроде handle рассматривать не буду) - только то, что может пригодится в даже самой сложной карте. Если вы не собираетесь писать новую библиотеку функций, то это вам не понадобится.
Первое правило, на которое надо обратить внимание, особенно если вы занимались раньше программированием. Правило очень простое: A != a - то есть, строчные и заглавные буквы различаются! Если ваша функция называется myfunc, а вы вызовете ее как MyFunc, то интерпретатор выдаст ошибку. Будьте внимательнее!
Второе - нет форвардинга, т.е. если вы определили функцию или переменную после ее вызова (по строчкам - вызов на 100 строке, определение начинается на 120), то интерпретатор выдаст ошибку. Теперь понятно, почему main стоит в самом конце программы?
Код программы состоит из строк. Слова разделяются пробелом. Если пробелов несколько, они считаются как один. В отличие, скажем, от Delphi или Cpp, символы, указывающие конец строки (';'), не нужны. Вместо них служит признак переноса строки (0D0Ah) - когда вы нажимаете enter и переходите на новую строку, эти два символа появляются в конце старой строки и не видны пользователю, но указывают программе, что надо перенести строку. Простой пример:
set MyVarX = 26
set MyVarY = 26
Это два выражения разделены переносом строки. К сожалению, из этого следует, что перенос строки не может служить пробелом, поэтому пример ниже приведет к ошибке:
// Неправильно - интерпретатор посчитает это как две строки с ошибками.
set MyVarX = 26 * MyVarY +
MyVarZ
// Правильно
set MyVarX = 26 * MyVarY + MyVarZ
Если между двумя строками стоит несколько переносов (пустых строк), то они воспринимаются интерпретатором как одна. Да, для тех, кто не знает - интерпретатор (в отличие от
компилятора, который переводит программный код в машинный) непосредственно выполняет программу. War3 - типичный интерпретатор (в отличие от Cpp, который компилирует исходный код в исполняемый файл).
Теперь перечислю основные ключевые слова с кратким комментарием, хотя могу забыть написать какое-нибудь ключевое слово. Да, в скрипте двойной слэш // означает комментарий - все слова до конца строки после него игнорируются. Очень удобно использовать для временного 'отключения' ненужных строк.

1. Объявление функций:

function - объявляет функцию, после этого слова идет имя функции. Также используется как значение переменных типа boolexpr (см. далее - типы переменных)
endfunction - обозначает конец функции.
takes - используется в строке объявления, после этого слова идет список входных аргументов.
returns - используется в строке объявления, после этого слова идет тип возвращаемого значения.
nothing - aka null, используется в строке объявления после takes и / или returns и указывает что нет входных / выходных аргументов - смотря где стоит.
return - используется в теле функции, после этого слова стоит значение, которое должна вернуть функция. Если функция ничего не возвращает, то после ничего и не стоит.
call - вызов функции, после этого слова идет ее имя.

Синтаксис:

function FuncName takes XaType, Xa ... XbType Xb returns YType
// Это тело функции, в нем может быть строка return Y - возвращает значение Y.
endfunction

FuncName - имя функции. Редактор использует определенную классификацию (наподобие переменных - см. пред. статью. Кого заинтересует - расскажу подробно).
XaType - тип первого входного аргумента (см. раздел 'типы переменных')
Xa - название первого входного аргумента
XbType - аналогично для последнего аргумента
Xb - название последнего аргумента
YType - тип возвращаемого значения (оно всего одно).
Функция может брать как и несколько входных аргументов, так и один или вообще ничего не брать. Ни одно из входных, ни выходное значения не могут быть массивом!!! Это очень серьезный недостаток JASS. Ниже приведены примеры для одного аргумента, для трех и для функции без аргументов:

function MyFunction takes integer Number returns boolean
// Тело функции, у нее входной аргумент - Number, его
// тип - integer (целое число),
// функция возвращает булевское значение.
// Остальные примеры - аналогично.
endfunction

function MyBigFunction takes boolean Number, region MyUnitReg, real UnitLife returns unit
// Тело функции, входных аргументов много, а возвращает
// переменную типа unit (юнит в игре).
endfunction

function MyVoidFunction takes nothing returns boolean
// Тело функции.
endfunction

Конечно, если функция ничего не возвращает, то после returns ставится nothing. Не забудьте - все ключевые слова пишутся с маленькой буквы! Не забывайте, в каком регистре написаны имена переменных - потом это приведет к ошибкам.

Вызов функции из тела другой функции - не забудьте определить функцию ДО того, как она будет вызвана.

call FunctionName(Xa,...,Xz)

Xa - Xz - все аргументы, их число и тип должны строго совпадать с определением функции FunctionName. Пишутся через запятую. Если аргументов нет, то пустые скобки пишутся обязательно! Если функция вызывается из выражения или как аргумент, то сall писать не надо. Пример:

call FunctionA(FunctionB(X,Y),Y)

Здесь функция FunctionB со своими аргументами X и Y используется как входной аргумент FunctionA. Разумеется, тип первого аргумента FunctionA и тип возвращаемого аргумента
FunctionB должны быть совместимы (в Jazz 99% случаев под совместимостью понимается равенство типов - это вам не Delphi)

2. Условия

if - оператор условия, после него идет выражение, которое должно возвращать булевское значение (правду или ложь).
then - используется в строке с if, после этого слова на следующей строке идет список действий, которые выполняется, если условие выполнено.
elseif - после этого слова на следующей строке идут действия, которые выполняются когда условие не выполнено.
endif - обозначает конец оператора if и ставится обязательно!

Синтаксис:

if Condition then
// Действия, если условие выполнено.
elseif
// Действия, если условие не выполнено.
endif

if Condition then
// Действия, если условие выполнено. Используется,
// если действия elseif не нужны.
endif

Condition - выражение или функция, возвращающие булево значение, а также переменная булевого типа. В выражениях можно использовать любые операторы / переменные / функции, но главное условие - тип возвращаемого значение - бул! Конечно, внутри выражения типы должны быть cовместимы. Пример (см. ниже, если что непонятно):

if (UserEnteredNumber >= 26) and HeroIsAlive then
set Number = 0
call MyFunctionA()
else
set Number = UserEnteredNumber
call MyFunctionB()
endif

В этом примере когда выражение (UserEnteredNumber >= 26) and HeroIsAlive выполнено, т.е. равно 'true', запускается ветка set Number = 0 и call MyFunctionA(). Если нет, то - set Number = UserEnteredNumber. Да, в между then / esle / endif можно вставить НЕСКОЛЬКО строк! Если помните, в редакторе - только одно действие, в результате чего часто приходилось копировать действия с if и по нескольку раз выполнять одну и ту же проверку. Здесь этого маразма нет, не знаю, зачем он был сделан в редакторе. Вроде в TFT исправили. И вообще, код, написанный от руки обычно раз в несколько раз меньше генерированного редактором и выполняется гораздо быстрее.

3. Операторы сравнения - возвращают булевское значение (см. раздел 'типы переменных' -
далее)


> и < - больше и меньше - используется для сравнения любых чисел
== - равно. Ну путать с одним знаком = - он используется не для сравнения, а для приравнивания! Можно сравнивать две строки.
<= и >= - что это такое, догадаться нетрудно. Надо помнить - местами знаки 'равно' и 'больше / меньше' менять нельзя, то есть оператор => будет ошибкой!
!= - не равно - условие выполнено, если выражения справа и слева не равны. Можно сравнивать две строки.

Синтаксис:

A operator Б

Типы операндов A и B должны быть совместимы, то есть нельзя сравнивать число со строкой, а юнит с регионом Но можно, например, перевести число в строку и затем сравнить. Пример:

A >= B

Это выражение будет правдой (true), если А больше, чем B или равно ему и ложью (false), если наоборот - B больше, чем A. Все эти операторы возвращают булевый тип переменной!

4. Операторы для булевых переменных (Те, кто не знает, что такое 'булева переменная' - смотрите раздел 'типы переменных').

not - инверсия (отрицание) - верно, когда операнд - ложь и наоборот.
and - логическое 'и' - верно, когда все операнды (A и B) верны.
or - логическое 'или' - верно, когда хотя бы один операнд верен.
Оператора исключающего или (xor) я в Варкрафте не обнаружил - кому надо пишите сами: (A xor B) то же самое, что и ((not A) and B) or ((not B) and A).

Синтаксис:
A operator B

Примеры:
not A
A and B
not (A or B)
Операторы для булевых типов всегда возвращают булевый тип!

5. Работа с переменными

globals - используется в начала файла, после этого слова идут определения всех глобальных переменных. Такие переменные доступны в любой точке программы. Все переменные, которые создаются пользователем в редакторе переменных - глобальные.
endglobals - указывает окончание раздела глобальных переменных.
local - используется внутри тела функции, после этого слова идет определение локальной переменной, то есть переменной, которая доступна только в той функции, где она была определена. В редакторе триггеров World Edit с такими переменными работать нельзя. А зря - на самом деле одна из самых полезных вещей в скрипте.
set - после этого ключевого слова идет установление значения переменной или ее создание для некоторых типов переменных (см. далее)
constant - после этого слова идет определение константы
array - обозначает, что переменная - массив. Ставится сразу за определением типа переменной. Массив - набор из нескольких переменных одного типа (в математике - понятие 'вектор'). Пример массива из строк: string array MyStrings
null - нулл, он и есть нулл - обозначает дырку от бублика. Если переменной присвоено это значение, то она существует, но ровным счетом ничего не содержит. При попытке прочитать такую переменную игра радостно вылетает в OS с еггогом 'memory couldn't be read' Типичный пример - обращение к динамическому массиву set IntA = MyIntegerArray [-1] - вертолет гарантирован!

Синтаксис:

// В начале файла идут globals, их нельзя писать
// в другом месте!

globals
VarType gg_Var = null
VarNumType gg_NumVar
constant ConstType ConstName
// Приравнивание к null в начале требуют все переменные
// (хе-хе, кто не знает - скорее всего, такие переменные в
// самом представлении Варкрафта описываются хорошо
// известным любому программисту типом class), кроме
// числовых и строк. Классификацию имен (что такое gg_)
// смотрите в предыдущей статье.
// Аналогично и для констант. World Edit их определение
// вообще не использует в карте.
endglobals

Использование локальных переменных внутри тела функции и установление значений, а также обращение к массиву:

function MyFunc takes integer Number returns boolean
local VarType VarName = InitValue
// VarType - тип вашей переменной, VarName - ее имя.
// При желании можно назначить ей начальное значение -
// написать 'равно' и значение. Очень удобно, что значение
// может возвращать функция / переменная / выражение
// этого типа, например:
// local integer PNum = GetPlayerNumber(VarPlayer) + 1
// Внимание! Определения локальных переменых должны
// идти в начале функции! Иначе будет ошибка!
// Тут тело функции.
set Var = NewValue
// Var - переменная, которую приравниваем значению
// NewValue - оно может быть также переменной /
// функцией / выражением. Если надо написать сложное
// выражение, используйте скобки () для расстановки
// приоритетов.
set MyArray[ArrayIndex] = NewValue
set Var = MyArray[ArrayIndex]
// Обращаемся к элементу массива MyArray с номером
// ArrayIndex. Разумеется, ArrayIndex может
// быть как числом, так и переменной / функцией или
// выражением.
// ВНИМАНИЕ! - перед чтением элемента, убедитесь, что
// его значение уже установлено. Читайте предупреждение
// в начале этого параграфа - см. null
endfunction

6. Математические / строковые операторы.

+ - сложить, можно использовать со строковым типом string для склейки строк.
- - вычитание.
/ - деление (зависит от типа - целое число или real)
* - умножение.
"" - между этими символами заключается строка. Тут есть много тонкостей (см. след. статью)

За примером далеко ходить не надо:

set A = F + 26
set MyStr = "Привет всем!" + " Короче, вы уже все проиграли."

7. Циклы.

В языках програмирования существует несколько типов циклов, скрипт WE использует самый универсальный - loop с выходом по условию. Редактор триггеров предлагает пользователю только циклы for, да и то для двух переменных. В редакторе скриптов доступно гораздо большее. Итак, список ключевых слов:

loop - начало цикла, после этого слова на следующей строке начинается тело цикла.
exitwhen - после этого слова ставится условие, при выполнении которого програма выходит из цикла.
endloop - это слово обозначает конец цикла.

Синтаксис:

loop
// Действия до проверки условия.
exitwhen Condition
// Действия после проверки условия.
endloop

Condition - выражение / переменная или функция, возвращающая булевское значение. За каждый проход это условие проверяется и если значение равно true, программа выходит из цикла. В качестве условия необязательна должна идти проверка числа выполненных шагов - условие может быть любым, главное - чтобы возвращало boolean. Пример цикла с самым простым условием приведен ниже:

local integer LoopIndex = 1
loop
exitwhen LoopIndex > 10
set MyString = MyString + MyStringArray[LoopIndex]
set LoopIndex = LoopIndex + 1
endloop

В этом простом примере мы копируем все строки из строкового массива MyStringArray (размер массива равен 10 - дальше я расскажу как определять размеры массива в программе) и добавляем их к переменной MyString. Проверка условия выполняется в начале цикла. Если условие выхода - выполнение определенного числа циклов (контролируется переменной), то не забудьте прибавлять к этой переменной хотя бы единицу, иначе цикл будет бесконечным. Необязательно exitwhen ставить первой строкой - это зависит от того, как вы используете цикл. Конечно, можно использовать вложенные циклы - одна комбинация loop / endloop в другой.

8. Расстановка приоритетов.

В этом плане JASS не отличается от других языков. У скобок "(" и ")" - наивысший приоритет. Главное - не забывать их закрывать и не запутаться.

Автор: Cacodemon
© WC3.RU, 2002-2010 гг
Нашли ошибки и недоработки в статье? Сообщите нам в раздел Поддержки! С уважением, WC3.RU
__________________
Смотри подругому !
VAV вне форума   Ответить с цитированием
Старый 12.08.2010, 14:39   #2
VAV
Pandora Directive
 
Аватар для VAV
 
Регистрация: 04.09.2002
Адрес: Area 404
Сообщений: 3,611
VAV как роза среди колючек VAV как роза среди колючек VAV как роза среди колючек
Отправить сообщение для VAV с помощью ICQ
По умолчанию Ответ: Синтаксис JASS.

Другие статьи:

Основы JASS.
JASS - Общие понятия.
Синтаксис JASS.
JASS - Библиотечные функции. Часть 1.
JASS - Библиотечные функции. Часть 2.
JASS - Операторы.
JASS - Выражения
JASS - Комментарии.
JASS - Функции
JASS - Типы
JASS - Заключение.
Faq по созданию рельефа.
Зачем так много триггеров?
Немного об оптимизации кода.
Текстовые триггеры
Создаем простейшие карты (карты для melee)
Событие с переменным периодом.
Познаем триггеры (Triggers)
Познаем регионы (locations)
Познаем переменные...
Отлавливаем двойной клик мышью.
Массивы и циклы в обычных и текстовых триггерах
Локальные переменные в Custom Text
Камеры, спецэффекты, карта, цвета, кэш...
Добавление своих функций в триггеры
Добавление своих моделей и др. в карту
Делаем очень большую карту...
Делаем огнемет.
Улучшенная версия огнемета...
Глюки worldeditor'a
Random с задаваемой вероятностью - аура.
__________________
Смотри подругому !
VAV вне форума   Ответить с цитированием
Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +4, время: 17:42.

Design Developed by CompleteGFX
vBulletin® Version 3.6.7.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot