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

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

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

JASS - Функции




Функции

Функции объявляются следующим образом:
code:
function func_name takes param_list returns return_type
variable_declaration
variable_declaration
...
statement
statement
statement
...
endfunction


Читайте раздел "Глобальные определения" для подробностей. Помните, что вы не можете вызывать функции, которые еще не были объявлены (отсутствует понятие форвардинга), но функция может вызывать сама себя (рекурсия).

Если перед объявлением функции стоит слово constant, например:
code:
constant function const_func takes integer a returns nothing ... endfunction


Тогда вы не можете вызывать не константные функции из этой функции. Однако, вы все равно можете использовать set чтобы влиять на аргументы, так что она не "константна" в привычном программистам смысле. Она больше как "намек"...


Параметры

Как было сказано в разделе Глобальные определения, в объявлении функции пишутся типы и названия параметров, которые должны быть ей переданы. Когда функция вызывается, ей должны быть переданы выражения, соответствующие типам, которые прописаны в объявлении. Читайте раздел Типы для подробностей.

integer, real, boolean, string и code передаются по значению. Приведу пример того, что значит "передает по значению":
code:
function Foo takes integer a, string b
returns nothing
set a = 10
set b = b + " is a dummy"
// a == 10 и b == "joe is a dummy"

// однако, оригинальные данные, переданные функции,
// остались неизменными!
endfunction
...
local integer i = 5
local string = "joe"

call Foo(i, j)

// i все еще == 5, а j все еще == "joe"
Теоретически, это значит что, переменная копируется в функцию, и уже с копией происходят все действия (напомню, что мы сейчас говорим про параметры!).

Однако, все параметры типа handle передаются по ссылке. Например, делая что либо с переданным юнитом, это будет влиять на самого юнита, даже учитывая что это параметр функции. Например:
code:
function Bar takes unit u returns nothing

call PauseUnit(u, true)

// теперь юнит u остановлен, но переменная y
// тоже ссылается на того же юнита, так что y
// тоже остановлен теперь.
endfunction
...
local unit y = GetTriggeringUnit()


call Bar(y)
// юнит "y" остановлен
Строго говоря, нельзя сказать, что параметры передаются по ссылке. Правильнее будет сказать, что данные этого типа равны эквивалентны указателю, и используя native функцию чтобы что-либо сделать с этими данными, вы, по сути, делаете это с данными на которые указывает handle (как в Java). Еще, меняя значение handle также влияет на аргумент.
code:
function Goo takes unit u returns nothing
set =
CreateUnit(player1, 'hC00', 100, 100, 90)

// u теперь - новый юнит,
// но "y" все еще triggering unit
endfunction
...
local unit y = GetTriggeringUnit()


call Goo(y)
// "y" все еще triggering unit

Локальные переменные

Первая часть тела функции - объявления локальных переменных. Это переменные, которые создаются только тогда, когда мы запускаем функцию, и доступны только ей (а после окончания функции они стираются). Они объявляются следующим образом:
code:
local type name = expression


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

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


Выражения

После объявлений локальных переменных идет список выражений, которые и выполняют действия. Читайте раздел Выражения для подробностей.

Если функция что-либо возвращает, тогда в ней обязательно должно быть выражение return которое возвращает значение нужного типа.


Возвращаемое значение

Функция может возвращать какие-то значения (если у неё не написано nothing в объявлении). В этом случае, функцию можно применять в выражениях, будет использовано возвращаемое значение. Читайте раздел Выражения для подробностей.

Возвращаемые значения подчиняются тем же правилам передачи по-значению / по-ссылке что и аргументы (см. выше).


Функции входа

AI скрипты требуют пользовательскую функцию main, в то время как скрипты триггеров требуют функции main и config. Функция config вызывается еще до того как начнется игра, инициализируя карту. А main входная (т.е., иницилизируется первой) когда начнется игра.

Они должны объявляться именно так:
code:
function main takes nothing returns nothing
function config takes nothing returns nothing


Прим. переводчика: конечно, у обоих функций есть тело. Что в нем - написано в статьях Cacodemon'а. Однако, ни одна из этих функций не может брать аргументов. Собственно, откуда их и взять, если они - первые функции (даже до globals, хотя это и не функция)?

Автор: Raz
© WC3.RU, 2002-2010 гг
Нашли ошибки и недоработки в статье? Сообщите нам в раздел Поддержки! С уважением, WC3.RU
__________________
Смотри подругому !
VAV вне форума  
Старый 15.02.2010, 00:37   #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, 12.08.2010 в 14:32.
VAV вне форума  
Закрытая тема


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

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

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


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

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