Подготовка (триггеры) - Wc3-Maps Форум













[ Главная · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Подготовка (триггеры)
-
RazorДата: Пятница, 13-08-2010, 20:03:55 | Сообщение # 1
Ополченец

загрузка наград ...
Группа: Проверенные
Сообщений: 72
Репутация: 1186
Статус: Не на сайте
Введение

Если Вы являетесь новичком в создании карт для любимой, большинством играющего населения планеты, игры Warcraft III, то вам должно быть интересно как устроена система "программирования" для неё. специально для игр этой серии, мастерами из "Blizzard" был создан язык скриптов под названием Jass. В принципе он очень похож на остальные языки программирования и если Вам приходилось раньше писать программы, то он не должен показаться вам очень сложным в освоении. Для облегчения работы с ним были созданы специальные надстройки - GUI(Триггеры).

Глава 1. Начало работы с редактором

Для начала работы вам необходимо создать\открыть уже существующую карту и запустить "Редактор Триггеров". Чтобы это сделать, необходимо найти на панели инструментов иконку с изображением буквы "а" или нажать на клавишу "F4" находясь в окне редактора. Итак, начнём по порядку. Редактор триггеров состоит из нескольких блоков:

Панель управления, с вынесенными на неё основными клавишами. Для работы с триггерами используются только семь кнопок: Переменные (Cntr+B), Новая категория (Cntr+G), Новый триггер (Cntr+Е), Новый комментарий к триггеру (Cntr+M), Новое событие (Cntr+E), Новое условие (Cntr+D) и Новое действие (Cntr+R). Остальные являются общими и используется во всех окнах редактора

Список триггеров. Для удобства работы с ними можно создавать различные категории, в будущем, при компиляции кода они не будут учитываться и поэтому названия могут содержать в себе кириллицу, а вот названия триггеров не могут содержать в себе кириллических букв, а также не могут повторяться, даже находясь в различных категориях.

Текстовая зона , в ней находиться описание триггера. В ней Вы можете написать основные принципы работы триггера, действия, которые он выполняет, список переменных, которые нужно создать, чтобы перенести этот триггер в другие карты. В общем любую информацию

Окно кода триггера. Пожалуй, самая важная часть редактора триггеров. В ней Вы можете редактировать и создавать код карты. Подробнее о нем узнаем в следующей главе

Глава 2. Структура триггеров

Каждый триггер состоит из 3 частей:

* События (Events)
* Условия (Condition)
* Действия (Actions)

События.Чтобы триггер начал свою работу необходимо заполнить поле События (Events). Основными и наиболее часто используемыми событиями являются:

* “Map Initialization” (Срабатывает при загрузке карты)
* “Periodic Event” (Срабатывает каждый раз, когда таймер будет равен нулю)
* “Time Elapsed” (Срабатывает один раз, когда таймер будет равен нулю)
* “Generic Unit Event” (Срабатывает при выполнении юнитом какого-либо действия)

Также часто используемым событием является “Specific Unit Event”, оно очень похоже на “Generic Unit Event”, но с тем условием, что отслеживаются действия не всех юнитов, а только определённого.

Условия.Следующим этапом будет заполнение пункта “Условия”. Это необходимо для сужения области применения триггера.
Например, вам необходимо отследить применение какого-либо заклинания, тогда нужно создать событие ( щелкнув для этого правой кнопкой мыши и выбрав пункт “Новое событие(New Event)”) “Generic Unit Event”, выбрав там пункт “Начинает Применять Способность”. Далее нужно создать новое условие (аналогично созданию события) и выбрать там пункт “Ability Comparison”, после чего триггер примет примерно такой вид :

Код:

Quote

События:
“Боевая единица – A unit Начинает Применять Способность ”
Условиея:
“(Ability being cast) равно <Название вашего заклинания>”

Действия. Это является самой главной частью любого кода. Благо действий в редакторе карт достаточно чтобы превратить Warcraft в нечто новое и (надеюсь) оригинальное. А вообще создание действий аналогично созданию событий и условий. Триггеры являются своеобразным “конструктором” в который нужно просто подставлять нужные вам условия, действия и т.д.

Каждый триггер имеет 2 состояния: включён и выключен соответственно. Чтобы выключить триггер необходимо нажать правой кнопкой мыши и выбрать пункт “Изначально включён”. Для работы с триггерами используется вкладка “Триггер” при выборе действия. Включение и выключение триггеров даёт массу особенностей. Например, если вам нужно при нахождении определённого артефакта у юнита, давать ему золото, то легче отследить нахождение у юнита этого артефакта и включить триггер, дающий золото определённому игроку. Также это можно реализовать и просто одним включенным триггером, проверяя при каждом исполнение значение переменной, означающей находится ли артефакт у юнита (Например, переменная типа “Логическая (Boolean)”) и делать тоже самое, но вместо включения триггера поставить действие, которое изменит значение переменной на противоположное

Глава 3. Переменные

Для улучшения работы с кодом можно использовать переменные. Они значительно упрощают работу с кодом и могут помочь при оптимизации. Все переменные делятся на Локальные и Глобальные. Сначала мы остановимся на изучении Глобальных переменных, т.к. Локальные переменные редко используются триггерами, но тем не менее являются важной частью изучения. Для создания глобальных переменных необходимо нажать, находясь в редакторе триггеров, сочетание клавиш “Ctrl + B”. Переменные имеют множество типов, можно создать переменные со значением юнитов, чисел, спецэффектов и т.д. Чтобы изменить значения переменной, необходимо создать действие “Set Variable”, выбрать в настройках переменную и значение. Использование переменных может значительно улучшить быстродействие игры. Например, можно занести в переменную позицию того или иного юнита и больше не использовать функцию определения положения вообще. Также переменные можно использовать как средство обмена информации между другими триггерами проекта.
Ну а теперь мы перейдём к локальным переменным. Эти переменные создаются и используются в пределах 1 функции. Они являются “универсальным” средством создания чего-либо. Локальные переменные редко применяются в триггерах, а в Jass’е просто незаменимы. Все же средствами триггеров можно использовать и их, но это практически нигде не применяется, а используют сразу Jass. Это своеобразное использование жасса прямо в триггерах. Для этого существует действие “Custom Script” . Вообще действие “Custom Script” используется для вызова функций из особого Custom Script’а карты, написанного кстати на Jass’е и интерпритируется как обычный Jass код, чтобы отредактировать или просто посмотреть его необходимо нажать на пункте, имеющим название вашей карты в списке всех триггеров (Подробнее можно узнать о Custom Script’е при изучении самого жасса, но это не имеет никакого отношения к данному пособию).
Очень важным аспектом в изучении переменных являются массивы. Массив по сути это переменные с множеством значений. Например, чтобы записать всех юнитов на карте достаточно лишь 1 массива. Значения массивов меняются так “<Имя переменной массива>[номер элемента] = значение переменной” и считываются аналогичным способом.

Глава 4. Условия и Циклы

Очень важным элементом в создании карт являются условия и циклы. Сначала поговорим об условиях. Чтобы объявить новое условие необходимо создать действие “If /Then/Else”. Данное действие состоит из 3 частей. Первая часть это условие, вторая часть это действие, если условие вернёт истину, то оно будет выполняться, а третья часть это действия, но только те, которые будут выполняться, если вернётся лож. Теперь попытаюсь объяснить это всё на примере:
Код:

Quote

If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если - Условия:
<Имя переменной типа integer> рано 0
То – Действия:
Set <Имя переменной типа integer> = 1
Иначе – Действия:
Set <Имя переменной типа integer> = 0

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

Следующим шагом будет изучение циклов. Они также являются практически неотемлемой частью любого кода. Если в вашей карте не будут использованы условия и циклы, то скорее всего ваша карта даже не доживёт до релиза и если честно я не встречал ни одной хорошей карты, в которой бы не было циклов или условий. И так начнём. Циклы используются в картостроении для выполнения однотипных действий. Примером может служить изменение переменных массива. Циклами являются все действия начинающиеся на “For Each…”, всего их 6 и каждая имеет свой синтаксис написания. В принципе они все похожи и разбирать каждую в отдельность нет смысла, поэтому мы остановимся на самой первой “ For Each Integer A, Do Multiple Action”. Удобство работы с этой функцией заключается в том, что можно менять не весь код функции сразу, как в “ For Each Integer A, Do Action ”, а по отдельности каждую строку. Число, равное количеству раз выполнения цикла, является переменная типа “Integer (Целочисленная)”. Чтобы получить её значение необходимо использовать вместо переменной функцию “For Loop Integer A”. Для примера используем вот такой код:
Код:

Quote
For each (Integer A) from 1 to 12, do (Actions)
Цикл – Действия:
Set Hero[(Integer A)] = “Нет боевой единицы”

Данный пример очищает переменные “Hero[1]”, “Hero[2]” , “Hero[3]”, … , “Hero[12]” от всех записанных в них значений. Также есть ещё одна интересная функция, функция “ For Each Integer Variable, Do Multiple Action”. Она нужна для замены переменной “A” на любую вашу переменную типа “Integer (Целочисленная)”. Синтаксис этой функции отличается от ранее рассмотренной и поэтому я приведу пример кода
Код:

Quote
For each (<Имя вашей переменной>) from 1 to 12, do (Actions)
Цикл – Действия:
Set Hero[(<Имя вашей переменной>)] = “Нет боевой единицы”

Я думаю все нашли отличия этих функций, но если перевести эти функции в Jass, то вы не найдёте никаких отличий за исключением названий переменных. Для первого примера создается локальная переменная с названием “bj_forLoopAIndex”, а во втором примере вместо этой переменной просто используется ваша. А вообще все эти шесть функций в текстовом виде выглядят одинаково и созданы в триггерном виде лишь для упрощения работы с циклами.

Глава 5. Различные секреты и примеры их исполнения

Как уже говорилось ранее, возможности триггеров практически безграничны. Большинство задач, которые казалось бы невозможны, можно с их помощью реализовать. На основе Warcrat’а были созданы множество других жанров. Начиная с гонок и заканчивая логическими играми. Некоторые секреты я и попытаюсь реализовать в этой главе.

Сборные артефакты.

Когда я только начинал программировать для этой игры, мне казалось что сборные артефакты это стандартная функция варкрафта. Это было реализовано практически во всех картах, в которые я играл. На самом же деле все не так просто. Или все же просто? Вот пример кода собирающего два и более артефактов в один:

Код:

Quote
События:
Боевая единица - A unit Получает предмет
Условия:
Действия:
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если - Условия:
((Triggering unit) has an item of type <Здесь название 1 артефакта>) равно Да
((Triggering unit) has an item of type <Здесь название 2 артефакта>) равно Да
То - Действие:
Предмет - Remove (Item carried by (Triggering unit) of type <Здесь название 1 артефакта>)
Предмет - Remove (Item carried by (Triggering unit) of type <Здесь название 2 артефакта>)
Герой - Create <Здесь название 3 артефакта> and give it to (Triggering unit)
Иначе - Действие:
Do nothing

Теперь буду объяснять что здесь написано. Во-первых необходимо отследить получение юнитом предмета, для этого используется событие “Generic Unit Event ”с выбранным “Получает предмет ”. Далее мы проверяем нахождение у юнита определённых артефактов и если они есть, то забираем их и даём другой. Все просто, но эта система далеко не универсальна, а точнее с помощью неё нельзя отследить нахождение у юнита два одинаковых артефакта. Самый распространенный способ это сканирование всех слотов на артефакты. Для этого мы создадим переменную типа “Целочисленная (Integer)”, назовём её “ ItemCount ” и рассмотрим этот код:
» Код
Код:

Quote

События:
Боевая единица - A unit Получает предмет
Условия:
Действия:
Set ItemCount = 0
For each (Integer A) from 1 to 6, do (Actions)
Цикл - Действия:
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если - Условия:
(Item-type of (Item carried by (Triggering unit) in slot (Integer A))) равно <Здесь название 1 артефакта>
То - Действие:
Set ItemCount = (ItemCount + 1)
Иначе - Действие:
Do nothing
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если - Условия:
ItemCount больше или равно 2
То - Действие:
Предмет - Remove (Item carried by (Triggering unit) of type <Здесь название 1 артефакта>)
Предмет - Remove (Item carried by (Triggering unit) of type <Здесь название 1 артефакта>)
Герой - Create <Здесь название 2 артефакта> and give it to (Triggering unit)
Иначе - Действие:
Do nothing

В начале, как и в прошлом действии, мы отследили получение юнитом предмета. Потом очистили переменную “ItemCount” от значения, вписанного в неё ранее. Следующем действием было сканирование слотов героя на нахождение определённого артефакта и если он находить у героя, то увеличиваем значение переменной “ ItemCount” на единицу. Далее проверяем значение переменной и если оно окажется больше или равно 2, то забираем 2 раза артефакт и даём другой. Вот и все, теперь и Вы можете создавать реалистичные системы артефактов используя данной код.

Внимание: руссификаторо на редактор триггеров лучше не скачивать т. к. многие (в том числе и я) пользуются английской версией, и помочь по триггерам вам не смогут (или будет трудно понять)

Вы можете задавать вопросы по триггерам.

Чтобы пройти в класс С по троиггерам вы должны выполнить несколько заданий и получить не менее 10 баллов.
Лёгкие задания
1. В начале игры влючается кинематический режим и в нём говорится описание карты. - 2б.
2. Если главный герой умирает, то игра заканчивается. - 1б.
3. В начале в кинематике должен триггерно идти (куда угодно) любой воин. - 3б.
4. В начале игры должен проигрываться диалог. (например инотавр, говорящий "Где враги?". - 3б
5. Триггерно должен появиться любой юнит - 2б.
6. В месте, где находится босс/финиш (короче место где закончится игра) каждые 30 сек на мини карте будет отмечаться цель. - 2б.
Средние задания
1. Диалоги героев должны отображаться над их головами плав. текстом. - 5б.

 
-
-killero4ek-Дата: Воскресенье, 19-12-2010, 11:39:41 | Сообщение # 2
Темный рыцарь

загрузка наград ...
Группа: Пользователи
Сообщений: 239
Репутация: 507
Статус: Не на сайте
Ну вот почему никто не пишет????Я кстати тоже пользуюсь английскими триггерами))) Теперь поучим Джасс)))

Локальные переменные.
Сегодня, братья, мы познакомимся с локальными переменными. Что же это такое? С глобальными переменными всё понятно: они создаются в специальном меню и хранятся в памяти всю игру. А локальные переменные... Локальные переменные это особый тип переменных, которых нельзя создать на обычных триггерах. Создаются они прямо во время выполнения триггера и могут выполнить множество полезных и незаменимых функций. Локальные переменные необходимы при создании спеллов в мультиплеерной игре. Без них спелл неунивверсален, а с ними наоборот. Приведу пример.
Юнит создаёт заклинание, после применения которого создаётся эффект, а через некоторое время исчезает. Многие из вас сохранили бы эффект через переменную, а потом через некоторое время удалили бы его. Но если эффектов создаётся несколько? Создавать массив? А если эффектов не один и не два, а очень много, то как же нам быть? И вот наше спасение-локальные переменные. В чём вся фишка-локальные переменные создаются отдельно для каждого триггера командой

Code
Local тип имя

*Пока ещё рано писать чисто на Jass, поэтому вставляйте код командой Custom Script
То есть если запустится несколько одинаковых триггеров, где создаётся локальная переменная local effect u, то в каждом триггере создастся своя независимая переменная u типа спецэффект. Пользуясь этим, мы можем при создании эффекта занести его сначала в глобальную переменную effect(Заранее созданную), а затем командой

Code
set local effect u = udg_effect

*В Jass перед глобальными переменными ставиться приставка udg_
**Если вы используете чистый-Jass код, то можно заносить спецэффект сразу в локальную переменную u
заносим в локальную переменную u, затем ждём некоторое кол-во времени, обратно заносим

Code
set udg_effect = local effect u

*Ещё раз повторюсь, если вы используете чистый Jass-код, то можно не писать эту команду, а удалять эффект сразу из u
и удаляем эффект, который записан в effect.
Кстати, локальные массивные переменные обозначаются

Code
Local тип array имя

А тепреь выполните какой нибуть маленький джасс код (можно с custom script), а потом скиньте мне)) И я поставлю вам 10б))) ЗА Большой джасс код даю 12б))))

Добавлено (19.12.2010, 11:39)
---------------------------------------------
Я учусь по 12бальной сис-ме, так что перевожу)))

5+__= 12б________3+__=6б
5 __= 11б________3 __=5б
5-__= 10б________3-__=4б
4+__= 9б_________2 = 2б)))
4 __= 8б_________1 = 1б)))) или поведение неут
4-__=7б_________


skype - killero4ek997
 
-
-killero4ek-Дата: Понедельник, 20-12-2010, 12:23:01 | Сообщение # 3
Темный рыцарь

загрузка наград ...
Группа: Пользователи
Сообщений: 239
Репутация: 507
Статус: Не на сайте
И где же твоя инфа??? У меня про джасс, про что ты будешь рассказывать?
skype - killero4ek997
 
-
playerДата: Понедельник, 20-12-2010, 19:36:49 | Сообщение # 4
Старый флудер

загрузка наград ...
Группа: V.I.P.
Сообщений: 2672
Статус: Не на сайте
Понял wacko
Учитель должен быть умнее своего ученика в 10 раз[^^ADMIRALL^^, 2010 г.],
дурак тот, кто не умеет скрывать свою мудрость.
 
-
playerДата: Среда, 22-12-2010, 09:24:14 | Сообщение # 5
Старый флудер

загрузка наград ...
Группа: V.I.P.
Сообщений: 2672
Статус: Не на сайте
Спасибо, я бы сам справился
Учитель должен быть умнее своего ученика в 10 раз[^^ADMIRALL^^, 2010 г.],
дурак тот, кто не умеет скрывать свою мудрость.
 
-
art(es)emДата: Вторник, 28-12-2010, 19:14:28 | Сообщение # 6
Демон

загрузка наград ...
Группа: Проверенные
Сообщений: 519
Репутация: 1018
Статус: Не на сайте
мда учить много
arena warcraft 3
воин:пехотинец
уровень:3

 
-
-killero4ek-Дата: Понедельник, 03-01-2011, 14:45:09 | Сообщение # 7
Темный рыцарь

загрузка наград ...
Группа: Пользователи
Сообщений: 239
Репутация: 507
Статус: Не на сайте
Вот еще инфа, вообщем это для учинеков класса С

События(Event) - Это то что уже произошло, к примеру Юнит вошол в регион. Это очень важная часть триггера, без события ничего не станется!
Действие - это то что происходит при определенном событии и условию. К примеру юнит входит в регион - убить этот юнит!
Условия - это то при каких обстоятельствах происходит данное условие! Мало ли того что юнит входит в зону?? Может нам надо чтобы умирали в этой зоне ТОЛЬКО герои?? Для этого существует условия - к примеру Юнит ис герой равно ДА!!


skype - killero4ek997
 
-
bi4ikДата: Среда, 02-02-2011, 23:04:36 | Сообщение # 8
Рыцарь

загрузка наград ...
Группа: Пользователи
Сообщений: 169
Репутация: 29
Статус: Не на сайте
А вот меня интересует вот эта функция:
Code
Личный сценарий

 
-
art(es)emДата: Четверг, 03-02-2011, 13:30:46 | Сообщение # 9
Демон

загрузка наград ...
Группа: Проверенные
Сообщений: 519
Репутация: 1018
Статус: Не на сайте
bi4ik, что именно
arena warcraft 3
воин:пехотинец
уровень:3

 
-
bi4ikДата: Четверг, 03-02-2011, 15:56:32 | Сообщение # 10
Рыцарь

загрузка наград ...
Группа: Пользователи
Сообщений: 169
Репутация: 29
Статус: Не на сайте
art(es)em, все её возможности!!!!!!!
 
-
art(es)emДата: Пятница, 04-02-2011, 20:15:41 | Сообщение # 11
Демон

загрузка наград ...
Группа: Проверенные
Сообщений: 519
Репутация: 1018
Статус: Не на сайте
маде прям всё всё
arena warcraft 3
воин:пехотинец
уровень:3

 
-
bi4ikДата: Воскресенье, 06-02-2011, 22:09:53 | Сообщение # 12
Рыцарь

загрузка наград ...
Группа: Пользователи
Сообщений: 169
Репутация: 29
Статус: Не на сайте
art(es)em, желательно да!

Добавлено (06.02.2011, 22:09)
---------------------------------------------
ау-у-у-у-у-у


 
-
Dark_SamДата: Суббота, 05-03-2011, 13:34:55 | Сообщение # 13
Раб

загрузка наград ...
Группа: Пользователи
Сообщений: 15
Репутация: 26
Статус: Не на сайте
Вот моя мапа для сдачи! cool
хзхз... ПОЗНАЙ МАГИЮ!!!))
 
-
НиаласДата: Суббота, 05-03-2011, 17:11:17 | Сообщение # 14
Гнобитель троллей

загрузка наград ...
Группа: Проверенные
Сообщений: 270
Репутация: 808
Статус: Не на сайте
Сейчас проверю
 
-
Dark_SamДата: Суббота, 05-03-2011, 18:20:11 | Сообщение # 15
Раб

загрузка наград ...
Группа: Пользователи
Сообщений: 15
Репутация: 26
Статус: Не на сайте
ну как?
хзхз... ПОЗНАЙ МАГИЮ!!!))
 
-
NikstaRДата: Вторник, 08-03-2011, 18:50:55 | Сообщение # 16
Kawai killer pussies!

загрузка наград ...
Группа: V.I.P.
Сообщений: 1017
Репутация: 498
Статус: Не на сайте
Похоже норм)
 
-
НубикВЕДата: Среда, 30-03-2011, 18:41:34 | Сообщение # 17

загрузка наград ...
Группа: Пользователи
Сообщений: 187
Репутация: 261
Статус: Не на сайте
 
-
СаскеДата: Суббота, 28-05-2011, 23:09:58 | Сообщение # 18
Ополченец

загрузка наград ...
Группа: Пользователи
Сообщений: 96
Репутация: 143
Статус: Не на сайте
ЕЕЕЕЕЕЕЕЕЕ СКОКО НАДО УЧИТЬ ВЫ ЧЁ ВАЩЕ wacko wacko wacko wacko wacko


 
-
marsidaДата: Воскресенье, 29-05-2011, 13:14:56 | Сообщение # 19
Воин

загрузка наград ...
Группа: Пользователи
Сообщений: 106
Репутация: 59
Статус: Не на сайте
ничего не понимаю schmoll
разжуйте!

Skype:marsida2002
 
-
SentДата: Воскресенье, 29-05-2011, 19:30:41 | Сообщение # 20
#DARKSIDE

загрузка наград ...
Группа: Зам.Админа
Сообщений: 9158
Репутация: 8449
Статус: Не на сайте
marsida, Что не понятного?
Событие - что то произошло например: Мальчик облил себя керосином и поджог
Условие - кто себя подпалил например: Вася
Действие - После события что то произошло(если условие совпало) ПРИМЕР: Все вокруг заорали "ПОЖАР!!!!"
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:
Рейтинг@Mail.ru
Яндекс.Метрика

Copyright © 2010-2017
Вакансии :: Контакты
Мобильная версия сайта
chat