![]() | ![]() |
![]() |
#1 |
Pandora Directive
|
![]() JASS - Общие понятия. Глобальные определения Мы определяем программу на JASS или скрипт как несколько *.ai или *.j файлов, которые образуют либо рабочие триггеры карты, либо AI скрипт. Скрипт карты отвечает за инициализацию функций обратного вызова или, так называемых триггеров, которые срабатывают при определенном событии в игре. Вдобавок, скрипт, как правило, еще и инициализирует карту, создавая переменные начальных юнитов и устанавливая исходные параметры карты. Файлы, которые образуют скрипт карты это - common.j, Blizzard.j и war3map.j (загружаются в этом порядке). Прим. переводчика: на английском "функция обратного вызова" переводится как Callback. А определение такой функции, есть функция, которая вызывает другие функции. Однако с некоторыми оговорками... Впрочем, это не имеет значения. AI скрипт отвечает за постоянное "исполнение" построения зданий, заказ юнитов и атак для одного компьютерного игрока на карте. Файлы, которые составляют AI скрипт это - common.j, common.ai, и созданный пользователем AI скрипт (то есть, human.ai, elf.ai, и т.д.). common.j, Blizzard.j и common.ai находятся в директории Scripts/ в главном MPQ, но они могут быть "подменены", если их положить в *.w3x. Фунции и переменные, которые находятся в этих файлах, мы определяем библиотечными, так как они загружаются во всех картах и AI скриптах. Читайте раздел Библиотечные функции для подробностей. war3map.j находится в каждом *.w3x файле. Он автоматически генерируется редактором каждый раз, когда вы сохраняете карту (таким образом, если вы отредактируете файл напрямую, то он будет перезаписан). Тем не менее, вы можете редактировать его части прямо в редакторе, используя кнопку "Custom Text". Прим. переводчика: именно то, что написано в скобках, дает много возможностей относительно того, как защитить карту. Но и это еще не все! Когда редактор сохраняет MPQ архив карты, то он его создает заного, и при этом сохраняет только те файлы, которые прописаны в listfile! В добавление к этому, процитируем Брет Вуда (прим. переводчика: на самом деле я не знаю, кто это, но, если не изменяет память, это один из программистов Blizzard, который занимался именно редактором): "В редакторе триггеров [TFT], если вы выберете корневую директорию в древовидной схеме слева, вы можете написать свои скрипты в основном окне справа. Этот код будет включен в скрипт карты прямо перед всеми остальными триггерами. Это хорошее место для того, чтобы разместить там разные функции, которые затем можно будет использовать в разных триггерах. Теоретически, вы можете весь скрипт карты сюда написать (имеются в виду сами триггеры), и совсем не делать 'обычных триггеров' (хотя вам и прийдется использовать хотя бы один, чтобы вызвать ваш код)". Учтите что переменные, которые вы создаете в редакторе переменных являются глобальными переменными. Тем не менее, когда редактор начнет генерировать код, он перенесет все названия переменных, прибавляя префикс udg_ и заменяя пробелы на нижнее подчеркивание _. Например, если вы создадите переменную, названную my unit group в редакторе переменных, то в скрипте она будет udg_my_unit_group. В JASS скрипте есть несколько глобальных определений. Эти определения есть: Описание (в смысле, объявления / создания) типов Глобальные переменные "Родные" (библиотечные) функции Функции, создаваемые пользователем В любом скрипте, все типы и глобальные переменные должны быть объявлены до всех пользовательских объявлений функций. В любом случае, вы не можете вызывать что-либо, что только будет объявлено (т.е., вы должны сначало создать тип, а только потом его "развлетвлять"; вы должны сначало определить глобальную переменную, а только потом использовать её в выражениях; вы должны сначало объявить функцию, а только потом вы её сможете вызывать, за исключением случая когда функция вызывает себя саму). Каждое объявление идет с новой строки (некоторые забирают по несколько строк). Определение типов JASS позволяет создавать новые типы следующим образом, где new_type это новый тип, а parent_type это уже объявленный тип, и новый тип будет являться его "подтипом". Читайте раздел Типы для подробностей. code: type new_type extends parent_type В любом файле, типы должны быть определены до объявления функций. Глобальные переменные Есть два "вида" переменных в JASS: глобальные и те, что доступны только одной функции. К глобальным переменным можно обращаться в любой функции. Второй "вид" это функции, определенные в ней самой (проще говоря - локальные), и её параметры. Глобальные переменные определяются следующим образом: code: globals type name = expressionendglobals Все объявления переменных пишутся в разделе globals и каждый на новой строке. type это, как можно догадаться, - тип переменной. Это может быть либо простым типом, либо массивом типа, которые объявляются следующим образом: type array name. Читайте раздел Типы для подробностей. name это имя переменной, expression это изначальное значение, которое, кстати, не обязательно ставить. Читайте Выражения для подробностей. Переменная не-массив может быть определена как константа, если перед объявлением написать constant. Это значит, что не возможно дать переменной другое значение, кроме изначального (т.е., в объявление обязательно надо писать изначальное значение, и нельзя использовать set с этой переменной). Например, вот переменная (типа integer) которая инициализируется со значением 10: code: integer numberOfStuff = 10 А вот константа, значение которой множитель двух переменных: code: constant integer howManyUnits = numberOfGrunts * numberOfAttacks Не иницилизированная строка: code: string someMessage Массив юнитов. Массивы не могут быть иницилизированы. code: unit array listOfUnits В любом файле, "блок" globals должен быть объявлен до всех функций, и может быть только один такой блок. Native функции Это те функции, которые встроены в движок Warcraft III. Они образуют интерфейс, который игра дает JASS кодерам. Вы, скорее всего, не будете создавать такие функции, за тем исключением, что вы имеете доступа к исходникам Warcraft III, но, скорее всего, вы будете их вызывать. Их примеры (вызова) есть в common.j, common.ai и Blizzard.j. Вот пример: code: native func_name takes param_list returns return_type Где func_name это название функции, param_list - упорядоченный, разделенный запятыми список аргументов, которые должны быть переданны функции при вызове, а return_type - тип данных, которые вернет функция, их может и вовсе не быть. Если вместо param_list написать nothing, то это будет значить что функция без параметров; если вместо return_type написать nothing, то это будет значить что функция без параматров, а следовательно и не может быть использована в выражении. Например, Native функция, которая берет строку и юнита, а возвращает ничего: code: native MakeUnitTalk takes string whatToSay, unit targetUnit returns nothing Native функции могут быть объявлены как константные. Читайте раздел фуркции для подробностей. Пользовательские функции Функция, созданная пользователем, похожа на native функцию, но у неё есть "тело" (body) в котором её описание (т.е., что она делает). Объявляется следующим образом: code: function func_name takes param_list returns return_type variable_declarationendfunction "Тело" функции состоит из объявлений локальных переменных после которых идут выражения и т.д. (оба могут отсуствовать). Читайте раздел Функции для подробностей. Функции также могут быть константными (ставится префикс constant). Автор: Raz © WC3.RU, 2002-2010 гг Нашли ошибки и недоработки в статье? Сообщите нам в раздел Поддержки! С уважением, WC3.RU
__________________
Смотри подругому ! |
![]() |