Пятница, 17.05.2024, 11:47


Главная
Регистрация
Вход
Welcome to Home Приветствую Вас Гость | RSS  
Меню сайта

Категории раздела
Мои статьи [25]

Мини-чат

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Мои статьи

[vJass] Библиотеки

Весь код расположенный в библиотеке, будет перенесен в самый верх файла 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
Категория: Мои статьи | Добавил: Enemy1PK (02.04.2017)
Просмотров: 379 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт

Поиск

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • База знаний uCoz

  • Copyright MyCorp © 2024uCoz