Раздел:
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 параметров на каждое и все это храню в массивах, но ведь можно это все оптимизировать?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.