Главная » Статьи » Создание карт » JASS / AI скрипты учебники

Осваиваем Jass: Глава 14, Глава 15.

06-12-2016» 14. Да здравствует SCV!
Рассмотрим один из наших старых примеров – полет юнита снаряда. Можно ли улучшить его при помощи SCV? Раньше нам приходилось использовать массивы, чтобы сохранить информацию, что такой-то юнит-снаряд летит к такой-то цели и имеет такой-то уровень заклинания. Теперь мы можем сопоставить эти данные непосредственно юниту-снаряду при помощи SCV. Т.е. записать все необходимые данные в cv. А как нам сделать периодический цикл по всем юнитам снарядам, чтобы сдвигать их? О, тут у нас появляются новые интересные возможности. Мы можем для каждого юнита-снаряда создать отдельный триггер с периодом 0.05, отвечающий за его передвижения к цели.
Ну допустим, мы создали триггер с событием Периодическое 0.05. А как прописать, что этот триггер должен работать только для определенного юнита-снаряда? Очень просто, мы сопоставим триггеру (триггер ведь тоже игровой объект!) нужный нам юнит-снаряд. И при запуске триггера сможем определить, что нужно двигать такой-то юнит-снаряд.

В целом система организации движения юнита-снаряда становится довольно простой. На основе этого принципа я сделал несколько геройских заклинаний - предлагаю тебе ознакомиться с ними. К примеру, герой Лорд Хаоса. Заклинания Звездный конус, Групповой файербол и Сфера Хаоса сделаны таким способом. Это открывает широчайшие возможности по созданию триггерных заклинаний любой сложности.

Рекомендую глянуть примеры подобных наработок здесь:
- моя наработка: герой Еретик ( www.xgm.ru/files.php?do=download&id=911&h=3009)
- моя наработка: герой Лорд Хаоса ( www.xgm.ru/files.php?do=download&id=910&h=3009)

Кстати, огромное достоинство системы SCV, что ее можно легко дополнить. Допустим, нам нужно чтобы объектам можно было сопоставлять триггеры и таймеры. К функциям SCV добавим новые:

Цитата:
function I2Tm takes integer i returns timer return i return null endfunction
Код:
function I2Tr takes integer i returns trigger return i return null endfunction
и еще две

Код:
function get_object_tmparam takes handle h, string key returns timer return I2Tm(GetStoredInteger(udg_cache, I2S(H2I(h)), key)) endfunction
Код:
function get_object_trparam takes handle h, string key returns trigger return I2Tr(GetStoredInteger(udg_cache, I2S(H2I(h)), key)) endfunction
Вот и все.

»15. Послесловие
Читатель, ты уже очень многое узнал о jass. Конечно, в jass полно и других важных наработок. Есть команды, позволяющие выводить текст в любом месте экрана. Есть спец. команды, позволяющие производить общие действия для всех игроков на одном только компьютере (например, играть такой-то звук). Есть наработки Vexorian-а, который по сути сделал такую же систему, как SCV ДимонаТ, но раньше. Есть методы, позволяющие упростить работу с группами юнитов. Есть методы создания специальных объектов, которые определяют, что юзер щелкнул мышкой в такую-то точку (на основании этого построен инвентарь ДимонаТ на 80 слотов). Но всему этому обучать я уже не буду, т.к. во-первых, сам многого не знаю, во-вторых, в случае необходимости ты уже сможешь разобраться самостоятельно. Можешь проверить - статьи по jass, которые раньше казались сложными и непонятными, теперь станут доступными, а материал изложенный в них - будет уже знаком.

Владея приемами работы с jass, самое главное для триггерщика - умение правильно ставить и находить решение задач, умение алгоритмизировать задачу, умение мыслить творчески. Про это я уже писал отдельную статью. Дальше, все уже зависит от твоих мозгов и твоего опыта.

Вот, к примеру, как-то раз попросил меня один картостроитель разобраться с тем, как устроено заклинание passive mana shield известного буржуйского автора. Идея в том, что повреждения должны наноситься мане, а когда мана кончится – жизни юнита. Думаю, ты уже догадаешься, как это сделать. Единственный способ, пригодный для этого методами war3 - отлавливать повреждения, полученные юнитом при помощи триггера с событием unit takes damage. Т.е. для каждого юнита с пассивкой, нужно создать такой триггер - это задача решаемая. При нанесении повреждения юниту, возможны разные случаи:
маны у юнита больше размера повреждения: в этом случаи мы восстанавливаем юниту жизнь и отнимаем ману.
маны у юнита меньше размера повреждения: в этом случае из полученного юнитом повреждения мы должны восстановить число жизни, равное количеству маны, а потом обнуляем ману.
Вроде все хорошо. Все, да не все. Оказывается, что событие unit takes damage срабатывает на какую-то долю секунды раньше, чем юниту наносится повреждение. Из-за этого, если жизнь юнита полная, мы пытаемся добавить жизнь и отнять ману. Но жизнь полная и поэтому добавлять к ней что-то бесполезно. Получается, что жизнь юнита все равно страдает. Мелочь, а не красиво.
Можно конечно сделать паузу 0.1 секунды и уже после этой паузы восстанавливать жизнь юнита. Тогда все работает нормально, но все таки видно, как жизнь юнита колеблется. Опять же, некрасиво.

Картостроитель предложил глянуть работу спела у буржуйского автора - там было столько jass кода, в котором было так лень разбираться, что я на это забил. Стал думать. Есть ли возможность отловить момент, когда у юнита отнимутся жизни? В принципе есть. Существует такое событие, которое срабатывает, когда жизнь юнита станет меньше указанного значения. Этим можно воспользоваться! Просто если жизни у юнита почти полные и нельзя использовать метод добавить жизнь сразу. Вместо этого мы СОЗДАДИМ ТРИГГЕР с событием, которое сработает, когда жизнь текущего юнита станет меньше текущего значения. Это произойдет буквально через миг. И именно в этот момент мы добавим жизни юниту обратно. Проверил – все сработало. А триггерный код получился заметно короче, чем у буржуя.


Удачных тебе наработок, Читающий .

К статье прикреплен файл: SCV.w3x

От издателя (Меня, ^Мистера_Хайда^): Могу всех заверить что я все тут читал =) Ушло всего 8 часов.

Категория: JASS / AI скрипты учебники | Добавил: imDarkCount (06-12-2016 в 17:03:12)
Просмотров: 1334 | Комментарии: 2 | Рейтинг: 3.7/3
Всего комментариев: 2
avatar
1
супер спс!!!
avatar
2
копипаст
avatar
Рейтинг@Mail.ru
Яндекс.Метрика

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