Раздел:
4. Триггеры

Вступление

Написать эту статью меня подвигло удивление от просмотра многих популярных и даже довольно неплохих карт. Заглянув так сказать «под капот» я был сильно удивлен что авторы даже не знают о таких простых вещах как «массив», не говоря уже про структуры, функции, записи и т.п.
Первым делом нашел на xgm похожую статью от DragonSpirit, точнее перевод. По сути в статье ничего не объяснено а она состоит только из описании всплывающих подсказок редактора.
Итак эта статья для полных новичков в редакторе триггеров, надеюсь после прочтения вы узнаете много нового и сократите время на разработку своих карт.

Переменная

Что такое переменная?
Ну вот представьте себе у вас на карте есть 5 юнитов, и вы хотите дать возможность игроку управлять только выбранным юнитом. По идеи в дальнейшем мы хотели бы запомнить этого юнита обращаться к нему не на прямую а просто указав некую абстракцию.
Проще говоря на примере:
У нас встает первая задача, как приказать юниту который выбрал игрок следовать в определенную точку?
Ну вы же не знаете кого выберет игрок и не можете просто указать определенному юниту двигаться в точку..
Это значит что нужно создать ссылку на юнита выбранного игроком. Причем то что находится в этой ссылке определит сам игрок выбором понравившегося ему юнита.
Вот пример простого триггера:
Если игрок щелкает по юниту
То:
Отключить этот триггер
Hero = Triggering Unit.
Допустим, игрок выберет морпеха, для игры эта запись будет означать
Hero = Морпех [50.32, 32.93]
Т.е у нас в переменной hero хранится ссылка на выбранного юнита, теперь мы можем приказать этому юниту следовать в точку:
Issue order Hero move to point001. (приказ Hero двигаться в Point001 )
Т.е двигаться в точку Point001 будет тот юнит которого выбрал игрок.
Для создания переменной нажмите ctrl+b в редакторе триггеров и дайте ей имя Hero. После чего в поле тип измените Integer на Unit. (т.е переменная будет содержать не число а ссылку на юнита)

Массивы

Итак, мы сделали триггер где любой игрок может выбрать любого юнита на карте после чего юнит станет «героем» и пойдет в точку001
Но если у нас 4 игрока?
Что будет если они все выберут одного и того же юнита?
Для ответа на эти вопросы мы должны узнать что такое массив.
Массив это контейнер переменных одинакового типа. Например массив Hero[4] означает что у нас может быть до 4 разных юнитов в одной переменной. А для удобства вместо 4 будет номер игрока который владеет выбранным юнитом.
Т.е герой первого игрока будет доступен под ссылкой Hero[1], второго под Hero[2] и т.д.
Давайте первым делом сделаем нашу переменную Hero массивом. Укажите в опциях array – 4.
Здесь 4 значит - "вместимость контейнера". Т.е в переменной Hero не может содержаться больше 4 юнитов. Ну так как игрока у нас 4, то этого вполне достаточно.
Теперь отредактируем наш триггер, в установки переменной hero укажите что она относится к игроку который выбрал юнита (Triggering Player)
Если любой игрок щелкает по любому юниту
То:
Отключить этот триггер
Hero[Номер_игрока_который_щелкнул_по_юниту] = Юнит_по_которому_щелкнули.
для игры эта запись будет означать (к примеру все 4 игрока выбрали юнита)
Hero[1] = Морпех [50.32, 32.93]
Hero[2] = Призрак [13.15, 56.13]
Hero[3] = Врач [19.11, 20.24]
Hero[4] = Крейсер [96.32, 13.93]
Как мы видим у всех игроков есть юниты, и если мы хотим например убить героя синего игрока (2 игрок), мы можем указать такое действие Убить юнита Hero[2].
Конечно игроки могут выбрать одного и того же юнита, можно это исправить добавив проверку в условия триггера что выбираемый юнит должны принадлежать нейтральному игроку, а после выбора менять владельца юнита на игрока который его выбрал.

Запись

Допустим вы уже достаточно узнали про переменные и массивы и решили сделать карту где надо защищать базу от постепенно нападающих врагов (волны).
Это может быть hero defence, tower defence и все такое прочее. Проще говоря у нас есть волны, а в каждой волне может быть разные юниты, точки нападения, сложность, особые параметры и т.п.
Для этой цели мы можем написать систему использующую записи.
Запись (я называю их структурой) является папкой в которой хранятся переменные. Например мы создаем папку «Волна» (wave) и в ней храним другие переменные к примеру «время волны», «количество врагов».
Обратится к таким переменным можно также как и к обычным, это будет выглядеть так
wave.units_count = 20
wave.time = 100
Создать запись можно нажав ctrl+U в редакторе триггеров. Затем нужно создать переменную и указать в типе переменной –Record (запись), и выбрать нашу запись из списка.
Сама по себе простая запись бесполезна, но что если сделать её массивом?
У нас сразу появляется простая система управления. Например под номером массива мы будем хранить номер волны, и тогда получим следующие:
Wave[1].unit_count = 10
Wave[1].time = 100
Wave[2].unit_count = 20
Wave[2].time = wave[1].time
Таким образом мы указали что на первой волне у нас должно быть 10 врагов и дается 100 секунд на их уничтожение (после чего допустим запускается следующая волна и еще 20 врагов).

Тип данных

Уже неплохо правда? А давайте облегчим себе жизнь, зачем нам помнить что хранится под очередной цифрой в массиве..
Например у нас есть переменная тип волны (wave_type) и в зависимости от значения она определяет (ну вы поняли тип волны). Например если она равна 1-это обычная волна, если 2-то волна с летающими врагами, если 3-то это босс.
А что если вместо цифр явно написать тут что мы имеем ввиду? А вот что:
If wave_type = air_wave then …
If wave_type = boss then …
Вроде намного удобнее чем 1 и 3. Но помимо этого можно использовать типы данных на более интересном уровне, и даже как индефикатор массива. Представим доту, и обозначим все вышки переменной.
Вы не поверите но мы можем сделать так:
Tower[top][middle] = Турель [10.33, 93.32].
Здесь top означает верхнюю дорогу а middle среднюю вышку.
Т.е мы записали что на верхней дороге средняя вышка является Турель [10.33, 93.32]
При определенном навыке можно даже обращаться к ним так убить юнита Tower[top], и игра уничтожит все вышки с верхней дорожки. Ну я думаю не составит труда придумать как можно использовать типы данных.
В любом случае игра подразумевает под типом данных целое число (integer), и для неё это выглядит так Tower[0][1] = Турель.
Создать запись можно на ctrl+P, а добавить в неё параметры на ctrl+w
мы указали что верхняя вышка которая на базе – это турель [52.00, 25.00]
Вот такими нехитрыми способами можно существенно сократить время при разработке карты. Удачи всем, надеюсь в следующих картах которые я открою авторы перестанут использовать сотни переменных, помечать все непонятными никому цифрами и делать ужасные вещи по незнанию простых вещей.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
14
12 лет назад
0
Статья гуд, но только для новичков.
0
34
12 лет назад
0
Hares:
Статья гуд, но только для новичков.
удивительно но нет )
как я написал выше вчера я открыл несколько карт из одной русскоязычной кампании (кстати сделано там все на высоком уровне), играть интересно и сказать что автор полный новичек язык не повернется, но оказалось он даже не использовал массивы предпочитая делать такие вещи:
button1
button2
...
button13
heroname1
heroname2
..
uipanel24
и все это хранилось по всем папкам триггеров )
0
22
12 лет назад
Отредактирован H
0
button1
button2
...
button13
ахах
3 комментария удалено
0
10
12 лет назад
0
Не умею пользоваться "типами данных" вот убейте или расскажите подробнее. А то у меня есть база данных для разных типов оружий, там с 10 параметров на каждое и все это храню в массивах, но ведь можно это все оптимизировать?
0
34
12 лет назад
Отредактирован H
0
Все очень просто, рассказываю на пальцах:
  1. нажимаем ctrl+P в редакторе триггеров, у нас создается новый тип данных. На самом деле тип данных так и останется integer, просто редактор будет отображать вместо чисел нужный нам контент )
  1. Меняем имя на weapon_type
  1. В списке выбираем values и нажимаем ctrl+Q что-бы создать новый тип данных.
  1. Создаем типы оружий которые будут влиять на применяемый алгоритм наносящий урон определенным типом (fire, silent, normal)
Теперь мы можем использовать их во всех местах триггеров. Просто там где нужно указать это свойство идем во вкладку Present и выбираем наше свойство.
У нас получилось что урон от огненного оружия равен 10.
Также можно создать свое действие наносящие урон, причем в качестве параметра мы укажем weapon_damage и больше ничего выбрать будет нельзя.
пример карты прикрепил (естественно наши функции пустышки которые ничего не делают)
Загруженные файлы
0
20
12 лет назад
Отредактирован Mihahail
0
Хорошая статья. Но действительно для новичков. Дада, редактор ск2 настолько крут, что в нем может сделать хорошую вещь даже новичек, пусть и дурацким способом
Только получается, что освоить редактор триггеров в 100 раз проще, чем редактор объектов, в отличие от варика =(
Так что думаю, что сейчас востребованнее статьи по редактору объектов.
0
34
12 лет назад
0
Так что думаю, что сейчас востребованнее статьи по редактору объектов.
я сам его почти не знаю )
все делаю по старинке через триггера
0
20
12 лет назад
0
Hellcore, вот и я не знаю (
И нас таких много.
Хотя есть вариант читать ск2мапстер, но что-то лень.
Кстати, если проще юзать триггеры, то по идее должно быть больше всяких инди/миниигр?
0
10
12 лет назад
0
Hellcore:
Все очень просто, рассказываю на пальцах:
  1. нажимаем ctrl+P в редакторе триггеров, у нас создается новый тип данных. На самом деле тип данных так и останется integer, просто редактор будет отображать вместо чисел нужный нам контент )
Вот эти слова описывают всю суть!!!!
сразу все понял =)
Был один такой персонаж на старом сайте, который разбирался в редакторе объектов, исчез куда то.
Этот комментарий удален
0
1
12 лет назад
0
как я написал выше вчера я открыл несколько карт из одной русскоязычной кампании (кстати сделано там все на высоком уровне), играть интересно и сказать что автор полный новичек язык не повернется,
А можно узнать название этой кампании?
0
34
12 лет назад
0
Что-то вроде "взгляд доминиона". Кампания не плохая, но тяжелая. -_-
Я так и не смог её пройти
0
1
12 лет назад
0
Hellcore:
Hares:
Статья гуд, но только для новичков.
удивительно но нет )
как я написал выше вчера я открыл несколько карт из одной русскоязычной кампании (кстати сделано там все на высоком уровне), играть интересно и сказать что автор полный новичек язык не повернется, но оказалось он даже не использовал массивы предпочитая делать такие вещи:
button1
button2
...
button13
heroname1
heroname2
..
uipanel24
и все это хранилось по всем папкам триггеров )
А что вы хотели от темного новичка, который массивы только по школьной программе Pascal'a знает? =)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.