XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
adic3x

offline
Опыт: 107,539
Активность:
define DistanceBetweenXY
Плюс тому, кто объяснит, почему данная конструкция потенциально забагована.
К слову, при использовании функции в одну строку vex долюен ее благополучно заинлайнить, а адик потом благополучно убрать из кода.
Старый 11.05.2014, 12:40
Extremator

online
Опыт: 40,226
Активность:
Я тут пока с группами мучаюсь... фильтры всякие и прочее... в общем тёмный лес пока для меня...
и ничего не выходит .-.
Старый 11.05.2014, 16:08
Кет

offline
Опыт: 111,234
Активность:
nvc123:
Кет, ос
пути к редактору
вару
карте
Спасибо, помогло =3
Пойду глобалки объявлять.

Отредактировано Кет, 11.05.2014 в 17:37.
Старый 11.05.2014, 16:43
Tobi123

offline
Опыт: 7,826
Активность:
Extremator:
Я тут пока с группами мучаюсь... фильтры всякие и прочее... в общем тёмный лес пока для меня...
и ничего не выходит .-.
Перебор, без фильтров, заносить всех юнитов в специальную группу для перебора, если юнит подходящая цель, то делать что-то, затем удалять юнита из группы.
Старый 11.05.2014, 17:13
nvc123
new status
offline
Опыт: 59,284
Активность:
Tobi123, в зависимости от цели перебора
Старый 11.05.2014, 18:02
adic3x

offline
Опыт: 107,539
Активность:
Мне кажется каким-то диким сюрреализмом Кет, который в 2014 идет ставить NGJP, чтобы объявлять глобалки.
Старый 11.05.2014, 21:59
Extremator

online
Опыт: 40,226
Активность:
Слушайте, в ведь JNGP обновляют? работает кто-то в этим делом?
И вероятно должна быть соответствующая тема с предложениями и указанием багов для исправления... Верно? есть такой топик?
... или не стоит задумываться об этом?
Старый 11.05.2014, 22:53
Msey
????
offline
Опыт: 67,346
Активность:
Extremator, лет как пять не работают)
Старый 12.05.2014, 00:26
GetLocalPlayer

offline
Опыт: 10,420
Активность:
Цитата:
Сообщение от Extremator:
1. Можно ли использовать что-либо в роли изображённого мною блока "глобалс" ? (и что это?)
2. Где мне можно вкрадце прочитать о том как и зачем использовать "глобалс" ? (или это мне пока рано?)

Давай проведем небольшой эксперимент.
Создадим новую карту и зайдем в редактор триггеров. Теперь, в разделе переменных, создадим новую переменную целочисленного типа с именем MyInteger и сохраним карту.
Готово? Замечательно! Скачиваем любой софт работающий с MPQ архивами и открываем в нем карту.
В появившемся списке выберем файл war3map.j (там записываются все триггеры имеющиеся в карте) и откроем его любым текстовым редактором.
Что же мы увидим? А увидим мы, помимо функций, область объявления глобальных переменных и нашу переменную MyInteger с соответствующей ей приставкой udg_.

Второй переменной, с кучей подчеркиваний, будет наш триггер инициализации карты, создаваемый редактором по умолчанию.

Теперь тоже самое проделаем в несколько ином формате.
Открыв карту в пресловутом Jass New Gen Pack, добавим в Custom Script карты следующие строчки:
Код:
globals
    real MyReal = 0.00
endglobals

Теперь сохраним карту, не забыв поставить галочку в настройках рядом с Enable JassHelper.
Вновь открываем карту как MPQ архив и заглядываем в содержимое файла war3map.j. И что же мы там увидим? Правильно, мы увидим нашу новую переменную в разделе globals! Да еще с подписью виновника происходящего.


Так что же мы получаем?
1. Все глобальные переменные объявляются в файле war3map.j и происходит это в отрезке кода, ограниченного операторными скобками globals/endglobals.
2. Глобальные переменные должны быть объявлены выше всех функций карты.

И что же происходит когда мы объявляем глобальные переменные в любом участке посредством globals/endglobals? Ничего особенного, просто JassHelper любезно перетаскивает их в самый верх кода, как раз туда, где они должны быть объявлены. Без использования Jass New Gen Pack, мы могли бы, с тем же успехом, вручную прописать необходимые переменные в разделе globals файла war3map.j.

Отредактировано GetLocalPlayer, 15.05.2014 в 12:48.
Старый 15.05.2014, 12:30
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,171
Активность:
GetLocalPlayer, ._. делать нечего, кроме как объяснять то, что уже разжевали?
Старый 15.05.2014, 13:18
GetLocalPlayer

offline
Опыт: 10,420
Активность:
Цитата:
Сообщение от Extremator:
3. Вопрос аналогичный 2-му, только просто библиотеки (library).

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

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

    function MyFunc takes nothing returns nothing
    endfunction
endscope


Всем спасибо, я кончил.

Отредактировано GetLocalPlayer, 16.05.2014 в 08:58.
Старый 15.05.2014, 14:04
ScorpioT1000
Работаем
offline
Опыт: отключен
Спасибо за болезнетворную копипасту материалов, которые автор сам должен был найти в соседней теме.
Старый 15.05.2014, 14:07
GetLocalPlayer

offline
Опыт: 10,420
Активность:
На здоровье. Копипастить из головы не так уж и сложно.
Старый 15.05.2014, 14:14
ScorpioT1000
Работаем
offline
Опыт: отключен
Зато очень вредно для автора.
Старый 15.05.2014, 14:22
Sergarr

offline
Опыт: 4,677
Активность:
Extremator, xgm.guru/filesv5/projects/100/4585/jassnewgenpack5d_experemental...
вот тебе нормальный джнпг с нормальным временем суток в редакторе, с нормальными константами и пр.
Старый 16.05.2014, 22:39
Msey
????
offline
Опыт: 67,346
Активность:
GetLocalPlayer, классненько, столько нового!!!! пиши еще статьи, не слушай скорпа. верь в себя!
Старый 17.05.2014, 13:13
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

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



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