WarCraft 3: [vJass] Библиотеки

» Раздел: Триггеры и объекты
» Автор оригинала: Vexorian
» Источник: http://www.wc3c.net/vexorian/jasshelpermanual.html

Библиотеки — library — еще один очень удобный инструмент, предоставленный народными умельцами.
Что же в них такого особенного? А имеют они следующие достоинства:

Библиотеки в war3map.j

Весь код расположенный в библиотеке, будет перенесен в самый верх файла war3map.j, сразу после объявления глобальных переменных globals/endglobals, это даже выше Custom Script карты. Например, мы можем написать библиотеку, в которой будут необходимые нам функции, такие как вычисление координат X и Y с полярным смещением, поместить ее в триггер, там где это будет удобно нам и обращаться к ним из любого места, даже из Custom Script карты.
Объявляются библиотеки следующим образом:
library Name
	<Здесь располагаются наши функции и переменные>
endlibrary

Ссылки между библиотеками

Одни библиотеки, могут ссылаться на другие библиотеки.
Предположим, что у нас есть несколько библиотек и функции внутри одной библиотеки А будут использовать функции, которые находятся внутри другой библиотеки B. Однако, как нам быть уверенными, что функции библиотеки B располагаются выше функций библиотеки A? Для этого используется ключевое слово uses
library A uses B
	<Функции библиотеки А>
endlibrary

library B 
	<Функции библиотеки B>
endlibrary
Таким образом, независимо от расположения библиотеки A относительно библиотек B, JassHelper автоматически перенесет весь код внутри библиотеки B выше кода внутри библиотеки A.
А в случае, если библиотека должна ссылаться на несколько библиотек, их достаточно перечислить через запятую.
library A uses B, C, D, F
	<Функции библиотеки А>
endlibrary
А также, кроме ключевого слова uses, можно воспользоваться словами needs или requires. На свой вкус.

Приватные конструкции

Библиотеки дают возможность объявлять приватные конструкции.
Предположим, мы написали какую-нибудь систему или способность для импорта в чужую карту. Однако, как мы можем быть уверены, что имена функций и переменных внутри библиотеки не совпадут с именами других функций или переменных используемых в карте? Вот тут нам на помощь приходят приватные конструкции, благодаря которым, имена функций и переменных не видно за пределами библиотеки, в которой используются.
Осуществляется это посредством ключевого слова private, которое нужно указывать перед объявлением функций или переменных.
Например:
library A
	globals
		private integer Time = 0
	endglobals
	
	private function MyPivateFunc takes nothing returns nothing
	endfunction

	function MyFunc takes nothing returns nothing
	endfunction
endlibrary
Здесь мы написали библиотеку с именем A, которая содержит переменную целочисленного типа Time и две функции MyPivateFunc и MyFunc.
Так как переменная Time и функция MyPivateFunc отмечены ключевым словом private, к ним невозможно получить доступ откуда либо, кроме библиотеки A. А вот функция MyFunc не была объявлена приватной, то есть ее можно вызвать извне библиотеки A.

Публичные конструкции

Библиотеки дают возможность объявлять публичные конструкции.
По большому счету, это тоже самое что и приватные конструкции. Объявив переменную или функцию публичной, мы не можем обратится к ней извне библиотеки напрямую, однако можем это сделать, добавив в качестве префикса к ее имени имя библиотеки и следом символ подчеркивания.
Например:
library A
	globals
		private integer Time = 0
	endglobals
	
	public function MyPublicFunc takes nothing returns nothing
	endfunction

	function MyFunc takes nothing returns nothing
	endfunction
endlibrary
Здесь переменная Time объявлена приватной и мы не можем к ней обратится никак извне библиотеки. Функция MyPublicFunc объявлена публичной, что дает нам возможность обратится к ней извне библиотеки, однако для этого нам придется добавить к ее имени префикс, состоящий из имени библиотеки и символа подчеркивания:
call A_MyPublicFunc()
Ну а функция MyFunc доступна извне библиотеки, как самая обычная функция.

Самоинициализация библиотек

Предположим, у нас есть необходимость, при инициализации карты создать какие-либо объекты, которые использует наша библиотека. Это могут быть юниты , эффекты, триггер и т.д. Однако как это, сделать не захламляя триггер инициализации карты? Очень просто! Достаточно создать внутри библиотеки функцию, которая будет производить нужные нам действия, а ее имя указать после объявления имени библиотеки, используя ключевое слово initializer.
Например:
library A initializer Init_A
	function Init_A takes nothing returns nothing
		call CreateUnit(Player(0), 'h000', 0.00, 0.00, 270.00)
	endfunction
endlibrary
Здесь, в момент инициализации карты, будет создан юнит с рав-кодом 'h000' в центре карты, под командованием красного игрока и направлением взгляда на 270 градусов, то бишь "лицом к игроку".

Области scope

Внутри библиотек можно объявлять области scope/endscope, однако внутри библиотек нельзя объявлять другие библиотеки. Фича весьма бесполезная, на мой взгляд. Внутри областей также можно объявлять другие области.
Области объявляются словами scope/endscope, а так же могут содержать приватные конструкции.
В отличии от библиотек, области остаются на том месте, где были объявлены. Они не будут перенесены в начало war3map.j
Например:
scope A
	globals
		private integer Time = 0
	endglobals

	function MyFunc takes nothing returns nothing
	endfunction
endscope

Просмотров: 2 406

nvc123 #1 - 3 года назад 0
эм
а это не копипаста из мануала?
у меня проблема с вордом
кому не лень гляньте
Это сообщение удалено
Кет #3 - 3 года назад (отредактировано ) 1
nvc123, я так понял, не копипаста, просто другой его перевод. ADOLF подтвердил.
По-моему, плохо, что мануала нет в базе, надо его добавить. Если добавлю, включу эту статью туда, а пока пусть хотя бы она повисит.
Buulichkaa #4 - 3 года назад 0
Кет, ссылки на все мануалы есть в инвентаре
Кет #5 - 3 года назад (отредактировано ) 0
Buulichkaa, я не об этом. В базе его нет.